update readme for v0.9.6
diff --git a/LICENSE b/LICENSE
index 281da4a..72091f9 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
 BSD License
 
-Copyright (c) 2017 Baidu, Inc. All Rights Reserved.
+Copyright (C) 2017-2018 Baidu, Inc. All Rights Reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
diff --git a/Readme.md b/Readme.md
index 778133f..2b7059f 100644
--- a/Readme.md
+++ b/Readme.md
@@ -1,6 +1,9 @@
 # Rust SGX SDK
 Rust SGX SDK helps developers write Intel SGX applications in Rust programming language. [[Paper pdf]](documents/ccsp17.pdf)
 
+## v0.9.6 Release
+This version provides security enhancement for untrusted IO and additional support for monotonic counter. Untrusted IO operations in `sgx_tstd::fs` `sgx_tstd::net` and `sgx_tstd::time` are **DISABLED by default** to reduce the untrusted surface, and can be enabled by features. Trusted time support is moved to `sgx_tservice::sgxtime` and monotonic counter is provided by `sgx_tservice::sgxcounter`. Please refer to [release_notes](release_notes.md) for further details.
+
 ## v0.9.5 Release
 This is a **milestone version**, and may be the last version before 1.0.0. It provides supports of network access, TLS connection, trusted/untrusted file system access, trusted/untrusted time, and environment variable operations. Most important, it supports `xargo`! Now `x86_64-unknown-linux-sgx` is the new platform target. All of the code samples and third-party libraries could be built by `xargo` via `XARGO_SGX=1 make` (cargo also supported by `make`). What's more, we provide a pair of TLS client/server [sample](samplecode/tls) as a complete stack of secure! Please refer to [release_notes](release_notes.md) for further details.
 
diff --git a/dockerfile/Dockerfile b/dockerfile/Dockerfile
index 605b32b..2b11721 100644
--- a/dockerfile/Dockerfile
+++ b/dockerfile/Dockerfile
@@ -66,7 +66,7 @@
 
 RUN wget 'https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-gnu/rustup-init' -O /root/rustup-init && \
     chmod +x /root/rustup-init && \
-    echo '1' | /root/rustup-init --default-toolchain nightly-2018-01-19 && \
+    echo '1' | /root/rustup-init --default-toolchain nightly-2018-02-05 && \
     echo 'source /root/.cargo/env' >> /root/.bashrc && \
     /root/.cargo/bin/rustup component add rust-src && \
     apt-get autoclean && apt-get autoremove && rm -rf /var/cache/apt/archives/*
diff --git a/dockerfile/experimental/Dockerfile b/dockerfile/experimental/Dockerfile
index 088300c..8dfba85 100644
--- a/dockerfile/experimental/Dockerfile
+++ b/dockerfile/experimental/Dockerfile
@@ -76,7 +76,7 @@
 
 RUN wget 'https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-gnu/rustup-init' -O /root/rustup-init && \
     chmod +x /root/rustup-init && \
-    echo '1' | /root/rustup-init --default-toolchain nightly-2018-01-19 && \
+    echo '1' | /root/rustup-init --default-toolchain nightly-2018-02-05 && \
     echo 'source /root/.cargo/env' >> /root/.bashrc && \
     /root/.cargo/bin/rustup component add rust-src && \
     apt-get autoclean && apt-get autoremove && rm -rf /var/cache/apt/archives/*
diff --git a/libunwind/build.rs b/libunwind/build.rs
index d8457da..11c4c2f 100644
--- a/libunwind/build.rs
+++ b/libunwind/build.rs
@@ -15,7 +15,7 @@
     let target = env::var("TARGET").expect("TARGET was not set");
 
     if target.contains("linux") {
-        if target.contains("musl") && !target.contains("mips") {
+        if target.contains("musl") {
             // musl is handled in lib.rs
         } else if !target.contains("android") {
             println!("cargo:rustc-link-lib=gcc_s");
@@ -43,5 +43,7 @@
         println!("cargo:rustc-link-lib=gcc_s");
     } else if target.contains("redox") {
         println!("cargo:rustc-link-lib=gcc");
+    } else if target.contains("cloudabi") {
+        println!("cargo:rustc-link-lib=unwind");
     }
 }
diff --git a/libunwind/lib.rs b/libunwind/lib.rs
index bf10ab5..0ef6ded 100644
--- a/libunwind/lib.rs
+++ b/libunwind/lib.rs
@@ -35,7 +35,7 @@
     }
 }
 
-#[cfg(all(target_env = "musl", not(target_arch = "mips")))]
+#[cfg(target_env = "musl")]
 #[link(name = "unwind", kind = "static", cfg(target_feature = "crt-static"))]
 #[link(name = "gcc_s", cfg(not(target_feature = "crt-static")))]
 extern {}
diff --git a/libunwind/libunwind.rs b/libunwind/libunwind.rs
index a2abe32..89b0e41 100644
--- a/libunwind/libunwind.rs
+++ b/libunwind/libunwind.rs
@@ -93,8 +93,7 @@
 }
 
 cfg_if! {
-if #[cfg(not(any(all(target_os = "android", target_arch = "arm"),
-                 all(target_os = "linux", target_arch = "arm"))))] {
+if #[cfg(all(any(target_os = "ios", not(target_arch = "arm"))))] {
     // Not ARM EHABI
     #[repr(C)]
     #[derive(Copy, Clone, PartialEq)]
diff --git a/release_notes.md b/release_notes.md
index 223db0b..66a351b 100644
--- a/release_notes.md
+++ b/release_notes.md
@@ -1,3 +1,10 @@
+# Rust SGX SDK v0.9.6 Release Notes
+**Support latest Rust nightly build (nightly-2018-02-05-x86_64-unknown-linux-gnu)**
+
+**Security enhancement** Added three features for `sgx_tstd`: `untrusted_fs` `untrusted_time` `untrusted_net` to control the insecure ocall interface. By default, io-related features in `fs/time/net` are **DISABLED**. To enable them, please add feature declarations such as `features = ["untrusted_fs"]` for sgx_tstd in `Cargo.toml`. All sample codes and third party libraries are updated accordingly. Note that data from unstrusted `fs/time` are **UNTRUSTED**and thus use them **AT YOUR OWN RISK**. Data from `net` are well-known as untrusted and need validation instinctively. We strongly recommend our TLS termination for network access, instead of using `net` directly.
+
+**Refined sgxtime and support sgxcounter** Moved the trusted time service to `sgx_tservice::sgxtime` and implemented the monotonic counter in `sgx_tservice::sgxcounter`.
+
 # Rust SGX SDK v0.9.5 Release Notes
 **Support latest Rust nightly build (nightly-2018-01-19-x86_64-unknown-linux-gnu)**
 
diff --git a/samplecode/backtrace/enclave/Cargo.toml b/samplecode/backtrace/enclave/Cargo.toml
index 62b1b11..1d43974 100644
--- a/samplecode/backtrace/enclave/Cargo.toml
+++ b/samplecode/backtrace/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "Backtracesampleenclave"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
@@ -12,4 +12,4 @@
 
 [target.'cfg(not(target_env = "sgx"))'.dependencies]
 sgx_types = { path = "../../../sgx_types" }
-sgx_tstd = { path = "../../../sgx_tstd" }
+sgx_tstd = { path = "../../../sgx_tstd", features = ["backtrace"] }
\ No newline at end of file
diff --git a/samplecode/backtrace/enclave/Xargo.toml b/samplecode/backtrace/enclave/Xargo.toml
index 8457060..032b5b1 100644
--- a/samplecode/backtrace/enclave/Xargo.toml
+++ b/samplecode/backtrace/enclave/Xargo.toml
@@ -10,6 +10,7 @@
 
 [dependencies.std]
 path = "../../../xargo/sgx_tstd"
+features = ["backtrace"]
 stage = 2
 
 [dependencies.sgx_rand]
diff --git a/samplecode/crypto/enclave/Cargo.toml b/samplecode/crypto/enclave/Cargo.toml
index 6154d3d..915996c 100644
--- a/samplecode/crypto/enclave/Cargo.toml
+++ b/samplecode/crypto/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "Cryptosampleenclave"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/samplecode/file/enclave/Cargo.toml b/samplecode/file/enclave/Cargo.toml
index e3e86f8..9c25bb0 100644
--- a/samplecode/file/enclave/Cargo.toml
+++ b/samplecode/file/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "Filesampleenclave"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/samplecode/hello-rust/app/Cargo.toml b/samplecode/hello-rust/app/Cargo.toml
index 0aec40f..1e54aa4 100644
--- a/samplecode/hello-rust/app/Cargo.toml
+++ b/samplecode/hello-rust/app/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "app"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["duanran01 <duanran01@baidu.com>"]
 build = "build.rs"
 
diff --git a/samplecode/hello-rust/enclave/Cargo.toml b/samplecode/hello-rust/enclave/Cargo.toml
index a7cb00f..b20378a 100644
--- a/samplecode/hello-rust/enclave/Cargo.toml
+++ b/samplecode/hello-rust/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "Helloworldsampleenclave"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/samplecode/helloworld/enclave/Cargo.toml b/samplecode/helloworld/enclave/Cargo.toml
index a7cb00f..b20378a 100644
--- a/samplecode/helloworld/enclave/Cargo.toml
+++ b/samplecode/helloworld/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "Helloworldsampleenclave"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/samplecode/hugemem/enclave/Cargo.toml b/samplecode/hugemem/enclave/Cargo.toml
index db9c98b..22e7614 100644
--- a/samplecode/hugemem/enclave/Cargo.toml
+++ b/samplecode/hugemem/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "Hugememsampleenclave"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/samplecode/localattestation/attestation/Cargo.toml b/samplecode/localattestation/attestation/Cargo.toml
index 9498684..b69e7d5 100644
--- a/samplecode/localattestation/attestation/Cargo.toml
+++ b/samplecode/localattestation/attestation/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "attestation"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [features]
diff --git a/samplecode/localattestation/attestation/Xargo.toml b/samplecode/localattestation/attestation/Xargo.toml
new file mode 100644
index 0000000..8457060
--- /dev/null
+++ b/samplecode/localattestation/attestation/Xargo.toml
@@ -0,0 +1,25 @@
+[dependencies]
+alloc = {}
+panic_unwind = {}
+panic_abort = {}
+
+[dependencies.compiler_builtins]
+features = ["c", "compiler-builtins"]
+git = "https://github.com/rust-lang-nursery/compiler-builtins"
+stage = 1
+
+[dependencies.std]
+path = "../../../xargo/sgx_tstd"
+stage = 2
+
+[dependencies.sgx_rand]
+path = "../../../xargo/sgx_rand"
+stage = 3
+
+[dependencies.sgx_serialize]
+path = "../../../xargo/sgx_serialize"
+stage = 3
+
+[dependencies.sgx_tunittest]
+path = "../../../xargo/sgx_tunittest"
+stage = 3
\ No newline at end of file
diff --git a/samplecode/localattestation/enclave1/Cargo.toml b/samplecode/localattestation/enclave1/Cargo.toml
index ed6da06..24424fd 100644
--- a/samplecode/localattestation/enclave1/Cargo.toml
+++ b/samplecode/localattestation/enclave1/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "enclave1"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/samplecode/localattestation/enclave2/Cargo.toml b/samplecode/localattestation/enclave2/Cargo.toml
index 43dbda2..afe3503 100644
--- a/samplecode/localattestation/enclave2/Cargo.toml
+++ b/samplecode/localattestation/enclave2/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "enclave2"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/samplecode/localattestation/enclave3/Cargo.toml b/samplecode/localattestation/enclave3/Cargo.toml
index 2e30672..764f24e 100644
--- a/samplecode/localattestation/enclave3/Cargo.toml
+++ b/samplecode/localattestation/enclave3/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "enclave3"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/samplecode/machine-learning/app/Cargo.toml b/samplecode/machine-learning/app/Cargo.toml
index 0aec40f..1e54aa4 100644
--- a/samplecode/machine-learning/app/Cargo.toml
+++ b/samplecode/machine-learning/app/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "app"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["duanran01 <duanran01@baidu.com>"]
 build = "build.rs"
 
diff --git a/samplecode/machine-learning/enclave/Cargo.toml b/samplecode/machine-learning/enclave/Cargo.toml
index b89db8e..65ffd16 100644
--- a/samplecode/machine-learning/enclave/Cargo.toml
+++ b/samplecode/machine-learning/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "Machinelearningsampleenclave"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/samplecode/remoteattestation/Application/enclave/Cargo.toml b/samplecode/remoteattestation/Application/enclave/Cargo.toml
index 85f3d6a..5b364aa 100644
--- a/samplecode/remoteattestation/Application/enclave/Cargo.toml
+++ b/samplecode/remoteattestation/Application/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "RAenclave"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/samplecode/sealeddata/enclave/Cargo.toml b/samplecode/sealeddata/enclave/Cargo.toml
index fe94d04..875829e 100644
--- a/samplecode/sealeddata/enclave/Cargo.toml
+++ b/samplecode/sealeddata/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "Sealdatasampleenclave"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/samplecode/serialize/enclave/Cargo.toml b/samplecode/serialize/enclave/Cargo.toml
index e3f69eb..181e59c 100644
--- a/samplecode/serialize/enclave/Cargo.toml
+++ b/samplecode/serialize/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "Serializesampleenclave"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/samplecode/sgxtime/app/Cargo.toml b/samplecode/sgxtime/app/Cargo.toml
index 0aec40f..1e54aa4 100644
--- a/samplecode/sgxtime/app/Cargo.toml
+++ b/samplecode/sgxtime/app/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "app"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["duanran01 <duanran01@baidu.com>"]
 build = "build.rs"
 
diff --git a/samplecode/sgxtime/enclave/Cargo.toml b/samplecode/sgxtime/enclave/Cargo.toml
index 47756c4..4545e78 100644
--- a/samplecode/sgxtime/enclave/Cargo.toml
+++ b/samplecode/sgxtime/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "Sgxtimeenclave"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/samplecode/sgxtime/enclave/src/lib.rs b/samplecode/sgxtime/enclave/src/lib.rs
index f206b78..caae25c 100644
--- a/samplecode/sgxtime/enclave/src/lib.rs
+++ b/samplecode/sgxtime/enclave/src/lib.rs
@@ -40,10 +40,6 @@
 
 use sgx_types::*;
 use sgx_tservice::*;
-//use std::string::String;
-//use std::vec::Vec;
-//use std::io::{self, Write};
-//use std::slice;
 
 #[no_mangle]
 pub extern "C" fn sgx_time_sample() -> sgx_status_t {
@@ -52,7 +48,7 @@
         Ok(_) => println!("Create PSE session done"),
         _ => println!("Cannot create PSE session"),
     }
-    let ttime = SgxTime::now();
+    let ttime = sgxtime::SgxTime::now();
     //println!("timestamp: {}", ttime.timestamp);
     match ttime {
         Ok(st) => println!("Ok with {:?}", st),
diff --git a/samplecode/test_all.sh b/samplecode/test_all.sh
index a8fc423..5797a6c 100755
--- a/samplecode/test_all.sh
+++ b/samplecode/test_all.sh
@@ -44,8 +44,8 @@
 
 for i in ${test_cases[@]}
 do
-	cd ${i} && XARGO_SGX=1 make && cd bin && echo -e '\n' | ./app && cd ../ && make clean && cd .. &&
-	cd ${i} && make && cd bin && echo -e '\n' | ./app && cd ../ && make clean && cd ..
+	cd ${i} && make && cd bin && echo -e '\n' | ./app && cd ../ && make clean && \
+	   XARGO=1 make && cd bin && echo -e '\n' | ./app && cd ../ && make clean && cd ..
 done
 
 echo "Done!"
diff --git a/samplecode/thread/enclave/Cargo.toml b/samplecode/thread/enclave/Cargo.toml
index c1c1935..d1e16e5 100644
--- a/samplecode/thread/enclave/Cargo.toml
+++ b/samplecode/thread/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "Threadsampleenclave"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/samplecode/tls/tlsclient/app/Cargo.toml b/samplecode/tls/tlsclient/app/Cargo.toml
index b35af11..796bbf5 100644
--- a/samplecode/tls/tlsclient/app/Cargo.toml
+++ b/samplecode/tls/tlsclient/app/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "app"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["duanran01 <duanran01@baidu.com>"]
 build = "build.rs"
 
diff --git a/samplecode/tls/tlsclient/enclave/Cargo.toml b/samplecode/tls/tlsclient/enclave/Cargo.toml
index 1dbe6ad..7025578 100644
--- a/samplecode/tls/tlsclient/enclave/Cargo.toml
+++ b/samplecode/tls/tlsclient/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "tlsclient"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
@@ -13,7 +13,7 @@
 [target.'cfg(not(target_env = "sgx"))'.dependencies]
 sgx_types = { path = "../../../../sgx_types" }
 sgx_trts = { path = "../../../../sgx_trts" }
-sgx_tstd = { path = "../../../../sgx_tstd" }
+sgx_tstd = { path = "../../../../sgx_tstd", features = ["untrusted_fs", "untrusted_net", "untrusted_time"] }
 
 [dependencies]
 rustls = { path = "../../../../third_party/rustls" }
diff --git a/samplecode/tls/tlsclient/enclave/Xargo.toml b/samplecode/tls/tlsclient/enclave/Xargo.toml
index c31d71e..ddb9ad1 100644
--- a/samplecode/tls/tlsclient/enclave/Xargo.toml
+++ b/samplecode/tls/tlsclient/enclave/Xargo.toml
@@ -10,6 +10,7 @@
 
 [dependencies.std]
 path = "../../../../xargo/sgx_tstd"
+features = ["untrusted_fs", "untrusted_net", "untrusted_time"]
 stage = 2
 
 [dependencies.sgx_rand]
diff --git a/samplecode/tls/tlsserver/app/Cargo.toml b/samplecode/tls/tlsserver/app/Cargo.toml
index b35af11..796bbf5 100644
--- a/samplecode/tls/tlsserver/app/Cargo.toml
+++ b/samplecode/tls/tlsserver/app/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "app"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["duanran01 <duanran01@baidu.com>"]
 build = "build.rs"
 
diff --git a/samplecode/tls/tlsserver/enclave/Cargo.toml b/samplecode/tls/tlsserver/enclave/Cargo.toml
index 80fbad0..3fe5ca3 100644
--- a/samplecode/tls/tlsserver/enclave/Cargo.toml
+++ b/samplecode/tls/tlsserver/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "tlsclient"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
@@ -13,7 +13,7 @@
 [target.'cfg(not(target_env = "sgx"))'.dependencies]
 sgx_types = { path = "../../../../sgx_types" }
 sgx_trts = { path = "../../../../sgx_trts" }
-sgx_tstd = { path = "../../../../sgx_tstd" }
+sgx_tstd = { path = "../../../../sgx_tstd", features = ["untrusted_fs", "untrusted_net", "untrusted_time"] }
 
 [dependencies]
 rustls = { path = "../../../../third_party/rustls" }
diff --git a/samplecode/tls/tlsserver/enclave/Xargo.toml b/samplecode/tls/tlsserver/enclave/Xargo.toml
index c31d71e..ddb9ad1 100644
--- a/samplecode/tls/tlsserver/enclave/Xargo.toml
+++ b/samplecode/tls/tlsserver/enclave/Xargo.toml
@@ -10,6 +10,7 @@
 
 [dependencies.std]
 path = "../../../../xargo/sgx_tstd"
+features = ["untrusted_fs", "untrusted_net", "untrusted_time"]
 stage = 2
 
 [dependencies.sgx_rand]
diff --git a/samplecode/unit-test/app/Cargo.toml b/samplecode/unit-test/app/Cargo.toml
index 0aec40f..1e54aa4 100644
--- a/samplecode/unit-test/app/Cargo.toml
+++ b/samplecode/unit-test/app/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "app"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["duanran01 <duanran01@baidu.com>"]
 build = "build.rs"
 
diff --git a/samplecode/unit-test/enclave/Cargo.toml b/samplecode/unit-test/enclave/Cargo.toml
index 509e972..2302d8d 100644
--- a/samplecode/unit-test/enclave/Cargo.toml
+++ b/samplecode/unit-test/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "Unittestsampleenclave"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
@@ -12,7 +12,7 @@
 
 [target.'cfg(not(target_env = "sgx"))'.dependencies]
 sgx_types = { path = "../../../sgx_types" }
-sgx_tstd = { path = "../../../sgx_tstd" }
+sgx_tstd = { path = "../../../sgx_tstd", features = ["untrusted_fs", "untrusted_time"] }
 sgx_tcrypto = { path = "../../../sgx_tcrypto" }
 sgx_tunittest = { path = "../../../sgx_tunittest" }
 sgx_trts = { path = "../../../sgx_trts" }
diff --git a/samplecode/unit-test/enclave/Xargo.toml b/samplecode/unit-test/enclave/Xargo.toml
index 8457060..7584c5b 100644
--- a/samplecode/unit-test/enclave/Xargo.toml
+++ b/samplecode/unit-test/enclave/Xargo.toml
@@ -10,6 +10,7 @@
 
 [dependencies.std]
 path = "../../../xargo/sgx_tstd"
+features = ["untrusted_fs", "untrusted_time"]
 stage = 2
 
 [dependencies.sgx_rand]
diff --git a/samplecode/zlib-lazy-static-sample/app/Cargo.toml b/samplecode/zlib-lazy-static-sample/app/Cargo.toml
index 0aec40f..1e54aa4 100644
--- a/samplecode/zlib-lazy-static-sample/app/Cargo.toml
+++ b/samplecode/zlib-lazy-static-sample/app/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "app"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["duanran01 <duanran01@baidu.com>"]
 build = "build.rs"
 
diff --git a/samplecode/zlib-lazy-static-sample/enclave/Cargo.toml b/samplecode/zlib-lazy-static-sample/enclave/Cargo.toml
index ca3aadf..6b77dd8 100644
--- a/samplecode/zlib-lazy-static-sample/enclave/Cargo.toml
+++ b/samplecode/zlib-lazy-static-sample/enclave/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "Zlibsampleenclave"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_alloc/Cargo.toml b/sgx_alloc/Cargo.toml
index 5723700..ba21ff8 100644
--- a/sgx_alloc/Cargo.toml
+++ b/sgx_alloc/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_alloc"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_rand/Cargo.toml b/sgx_rand/Cargo.toml
index 495d103..70a1158 100644
--- a/sgx_rand/Cargo.toml
+++ b/sgx_rand/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_rand"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_rand_derive/Cargo.toml b/sgx_rand_derive/Cargo.toml
index 9dcb0b8..0d25d2c 100644
--- a/sgx_rand_derive/Cargo.toml
+++ b/sgx_rand_derive/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_rand_derive"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_serialize/Cargo.toml b/sgx_serialize/Cargo.toml
index 2736bdd..1600eef 100644
--- a/sgx_serialize/Cargo.toml
+++ b/sgx_serialize/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_serialize"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_serialize_derive/Cargo.toml b/sgx_serialize_derive/Cargo.toml
index 6527708..95c62be 100644
--- a/sgx_serialize_derive/Cargo.toml
+++ b/sgx_serialize_derive/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_serialize_derive"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_serialize_derive_internals/Cargo.toml b/sgx_serialize_derive_internals/Cargo.toml
index 4c7ba96..1cb3f1e 100644
--- a/sgx_serialize_derive_internals/Cargo.toml
+++ b/sgx_serialize_derive_internals/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_serialize_derive_internals"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_tcrypto/Cargo.toml b/sgx_tcrypto/Cargo.toml
index 377b1ad..83e0c24 100644
--- a/sgx_tcrypto/Cargo.toml
+++ b/sgx_tcrypto/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_tcrypto"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_tdh/Cargo.toml b/sgx_tdh/Cargo.toml
index c34417a..3e3c0ae 100644
--- a/sgx_tdh/Cargo.toml
+++ b/sgx_tdh/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_tdh"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_tkey_exchange/Cargo.toml b/sgx_tkey_exchange/Cargo.toml
index f878114..eff4661 100644
--- a/sgx_tkey_exchange/Cargo.toml
+++ b/sgx_tkey_exchange/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_tkey_exchange"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_tprotected_fs/Cargo.toml b/sgx_tprotected_fs/Cargo.toml
index 5445373..a598bfc 100644
--- a/sgx_tprotected_fs/Cargo.toml
+++ b/sgx_tprotected_fs/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_tprotected_fs"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_trts/Cargo.toml b/sgx_trts/Cargo.toml
index 707bed1..af959d1 100644
--- a/sgx_trts/Cargo.toml
+++ b/sgx_trts/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_trts"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_tse/Cargo.toml b/sgx_tse/Cargo.toml
index 435e57b..714d938 100644
--- a/sgx_tse/Cargo.toml
+++ b/sgx_tse/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_tse"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_tseal/Cargo.toml b/sgx_tseal/Cargo.toml
index 97d1dc9..d393b80 100644
--- a/sgx_tseal/Cargo.toml
+++ b/sgx_tseal/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_tseal"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_tservice/Cargo.toml b/sgx_tservice/Cargo.toml
index 24e54b2..2060d97 100644
--- a/sgx_tservice/Cargo.toml
+++ b/sgx_tservice/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_tservice"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_tservice/src/lib.rs b/sgx_tservice/src/lib.rs
index f38f6bc..ca3e251 100644
--- a/sgx_tservice/src/lib.rs
+++ b/sgx_tservice/src/lib.rs
@@ -40,6 +40,9 @@
 
 extern crate sgx_types;
 
+pub mod sgxtime;
+pub mod sgxcounter;
+
 mod tae;
 pub use self::tae::*;
 
diff --git a/sgx_tservice/src/sgxcounter.rs b/sgx_tservice/src/sgxcounter.rs
new file mode 100644
index 0000000..d63fa4c
--- /dev/null
+++ b/sgx_tservice/src/sgxcounter.rs
@@ -0,0 +1,541 @@
+// Copyright (C) 2017-2018 Baidu, Inc. All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//  * Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in
+//    the documentation and/or other materials provided with the
+//    distribution.
+//  * Neither the name of Baidu, Inc., nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+use sgx_types::*;
+use core::cell::Cell;
+
+/// Monotonic counter ID
+pub struct SgxMonotonicCounter {
+    counter_uuid: sgx_mc_uuid_t,
+    initflag: Cell<bool>,
+}
+
+impl SgxMonotonicCounter {
+
+    ///
+    /// creates a monotonic counter with default owner policy and default user attribute mask.
+    ///
+    /// # Description
+    ///
+    /// Call new to create a monotonic counter with the default owner policy 0x1, which means enclaves
+    /// with same signing key can access the monotonic counter and default owner_attribute_mask 0xFFFFFFFFFFFFFFCB.
+    ///
+    /// The caller should call rsgx_create_pse_session to establish a session with the platform service enclave
+    /// before calling this API.
+    ///
+    /// Creating a monotonic counter (MC) involves writing to the non-volatile memory available in the platform.
+    /// Repeated write operations could cause the memory to wear out during the normal lifecycle of the platform.
+    /// Intel(R) SGX prevents this by limiting the rate at which MC operations can be performed. If you exceed
+    /// the limit, the MC operation may return SGX_ERROR_BUSY for several minutes.
+    ///
+    /// Intel(R) SGX limits the number of MCs an enclave can create. To avoid exhausting the available quota,
+    /// an SGX application should record the MC UUID that rsgx_create_monotonic_counter returns and destroy a MC
+    /// when it is not needed any more. If an enclave reaches its quota and previously created MC UUIDs have not
+    /// been recorded, you may restore the MC service after uninstalling the SGX PSW and installing it again.
+    /// This procedure deletes all MCs created by any enclave in that system.
+    ///
+    /// # Parameters
+    ///
+    /// **counter_value**
+    ///
+    /// A pointer to the buffer that receives the monotonic counter value.
+    ///
+    /// # Requirements
+    ///
+    /// Header: sgx_tae_service.edl
+    ///
+    /// Library: libsgx_tservice.a
+    ///
+    /// # Return value
+    ///
+    /// Monotonic counter ID
+    ///
+    /// # Errors
+    ///
+    /// **SGX_ERROR_INVALID_PARAMETER**
+    ///
+    /// Any of the pointers is invalid.
+    ///
+    /// **SGX_ERROR_BUSY**
+    ///
+    /// The requested service is temporarily not available.
+    ///
+    /// **SGX_ERROR_MC_OVER_QUOTA**
+    ///
+    /// The enclave has reached the quota of Monotonic Counters it can maintain.
+    ///
+    /// **SGX_ERROR_MC_USED_UP**
+    ///
+    /// Monotonic counters are used out.
+    ///
+    /// **SGX_ERROR_AE_SESSION_INVALID**
+    ///
+    /// Session is not created or has been closed by architectural enclave service.
+    ///
+    /// **SGX_ERROR_SERVICE_UNAVAILABLE**
+    ///
+    /// The AE service did not respond or the requested service is not supported.
+    ///
+    /// **SGX_ERROR_SERVICE_TIMEOUT**
+    ///
+    /// A request to the AE service timed out.
+    ///
+    /// **SGX_ERROR_NETWORK_FAILURE**
+    ///
+    /// Network connecting or proxy setting issue was encountered.
+    ///
+    /// **SGX_ERROR_OUT_OF_MEMORY**
+    ///
+    /// Not enough memory is available to complete this operation.
+    ///
+    /// **SGX_ERROR_OUT_OF_EPC**
+    ///
+    /// There is not enough EPC memory to load one of the Architecture Enclaves needed to complete this operation.
+    ///
+    /// **SGX_ERROR_UNEXPECTED**
+    ///
+    /// Indicates an unexpected error occurs.
+    ///
+    pub fn new(counter_value: &mut u32) -> SgxResult<Self> {
+
+        let mut counter_uuid = sgx_mc_uuid_t::default();
+        let ret = rsgx_create_monotonic_counter(&mut counter_uuid, counter_value);
+
+        match ret {
+            sgx_status_t::SGX_SUCCESS => Ok(SgxMonotonicCounter{
+                                            counter_uuid: counter_uuid, 
+                                            initflag: Cell::new(true),
+                                         }),
+            _ => Err(ret),
+        }
+    }
+
+    ///
+    /// creates a monotonic counter.
+    ///
+    /// # Description
+    ///
+    /// Call new_ex to create a monotonic counter with the given owner_policy and owner_attribute_mask.
+    ///
+    /// The caller should call rsgx_create_pse_session to establish a session with the platform service enclave
+    /// before calling this API.
+    ///
+    /// Creating a monotonic counter (MC) involves writing to the non-volatile memory available in the platform.
+    /// Repeated write operations could cause the memory to wear out during the normal lifecycle of the platform.
+    /// Intel(R) SGX prevents this by limiting the rate at which MC operations can be performed. If you exceed
+    /// the limit, the MC operation may return SGX_ERROR_BUSY for several minutes.
+    ///
+    /// Intel(R) SGX limits the number of MCs an enclave can create. To avoid exhausting the available quota,
+    /// an SGX application should record the MC UUID that rsgx_create_monotonic_counter_ex returns and destroy a MC
+    /// when it is not needed any more. If an enclave reaches its quota and previously created MC UUIDs have not
+    /// been recorded, you may restore the MC service after uninstalling the SGX PSW and installing it again.
+    /// This procedure deletes all MCs created by any enclave in that system.
+    ///
+    /// # Parameters
+    ///
+    /// **owner_policy**
+    ///
+    /// The owner policy of the monotonic counter.
+    ///
+    /// * 0x1 means enclave with same signing key can access the monotonic counter
+    /// * 0x2 means enclave with same measurement can access the monotonic counter
+    /// * 0x3 means enclave with same measurement as well as signing key can access the monotonic counter.
+    /// * Owner policy values of 0x0 or any bits set beyond bits 0 and 1 will cause SGX_ERROR_INVALID_PARAMETER
+    ///
+    /// **owner_attribute_mask**
+    ///
+    /// Mask of owner attribute, in the format of sgx_attributes_t.
+    ///
+    /// **counter_value**
+    ///
+    /// A pointer to the buffer that receives the monotonic counter value.
+    ///
+    /// # Requirements
+    ///
+    /// Header: sgx_tae_service.edl
+    ///
+    /// Library: libsgx_tservice.a
+    ///
+    /// # Return value
+    ///
+    /// Monotonic counter ID
+    ///
+    /// # Errors
+    ///
+    /// **SGX_ERROR_INVALID_PARAMETER**
+    ///
+    /// Any of the pointers is invalid.
+    ///
+    /// **SGX_ERROR_BUSY**
+    ///
+    /// The requested service is temporarily not available.
+    ///
+    /// **SGX_ERROR_MC_OVER_QUOTA**
+    ///
+    /// The enclave has reached the quota of Monotonic Counters it can maintain.
+    ///
+    /// **SGX_ERROR_MC_USED_UP**
+    ///
+    /// Monotonic counters are used out.
+    ///
+    /// **SGX_ERROR_AE_SESSION_INVALID**
+    ///
+    /// Session is not created or has been closed by architectural enclave service.
+    ///
+    /// **SGX_ERROR_SERVICE_UNAVAILABLE**
+    ///
+    /// The AE service did not respond or the requested service is not supported.
+    ///
+    /// **SGX_ERROR_SERVICE_TIMEOUT**
+    ///
+    /// A request to the AE service timed out.
+    ///
+    /// **SGX_ERROR_NETWORK_FAILURE**
+    ///
+    /// Network connecting or proxy setting issue was encountered.
+    ///
+    /// **SGX_ERROR_OUT_OF_MEMORY**
+    ///
+    /// Not enough memory is available to complete this operation.
+    ///
+    /// **SGX_ERROR_OUT_OF_EPC**
+    ///
+    /// There is not enough EPC memory to load one of the Architecture Enclaves needed to complete this operation.
+    ///
+    /// **SGX_ERROR_UNEXPECTED**
+    ///
+    /// Indicates an unexpected error occurs.
+    ///
+    pub fn new_ex(owner_policy: u16, owner_attribute_mask: &sgx_attributes_t, counter_value: &mut u32) -> SgxResult<Self> {
+
+        let mut counter_uuid = sgx_mc_uuid_t::default();
+        let ret = rsgx_create_monotonic_counter_ex(owner_policy, owner_attribute_mask, &mut counter_uuid, counter_value);
+
+        match ret {
+            sgx_status_t::SGX_SUCCESS => Ok(SgxMonotonicCounter{
+                                            counter_uuid: counter_uuid, 
+                                            initflag: Cell::new(true),
+                                         }),
+            _ => Err(ret),
+        }
+    }
+
+    ///
+    /// destroys a monotonic counter created by new or new_ex.
+    ///
+    /// # Description
+    ///
+    /// Calling destory after a monotonic counter is not needed anymore.
+    ///
+    /// The caller should call rsgx_create_pse_session to establish a session with the platform service enclave
+    /// before calling this API.
+    ///
+    /// destory fails if the calling enclave does not match the owner policy and the attributes specified in the
+    /// call that created the monotonic counter.
+    ///
+    /// Destroying a Monotonic Counter (MC) involves writing to the non-volatile memory available in the platform.
+    /// Repeated write operations could cause the memory to wear out during the normal lifecycle of the platform.
+    /// Intel(R) SGX prevents this by limiting the rate at which MC operations can be performed. If you exceed the
+    /// limit, the MC operation may return SGX_ERROR_BUSY for several minutes.
+    ///
+    /// # Requirements
+    ///
+    /// Header: sgx_tae_service.edl
+    ///
+    /// Library: libsgx_tservice.a
+    ///
+    /// # Errors
+    ///
+    /// **SGX_ERROR_INVALID_PARAMETER**
+    ///
+    /// Any of the pointers is invalid.
+    ///
+    /// **SGX_ERROR_BUSY**
+    ///
+    /// The requested service is temporarily not available.
+    ///
+    /// **SGX_ERROR_MC_NOT_FOUND**
+    ///
+    /// The Monotonic Counter does not exist or has been invalidated.
+    ///
+    /// **SGX_ERROR_MC_NO_ACCESS_RIGHT**
+    ///
+    /// The enclave doesn't have the access right to specified Monotonic Counter.
+    ///
+    /// **SGX_ERROR_AE_SESSION_INVALID**
+    ///
+    /// Session is not created or has been closed by architectural enclave service.
+    ///
+    /// **SGX_ERROR_SERVICE_UNAVAILABLE**
+    ///
+    /// The AE service did not respond or the requested service is not supported.
+    ///
+    /// **SGX_ERROR_SERVICE_TIMEOUT**
+    ///
+    /// A request to the AE service timed out.
+    ///
+    /// **SGX_ERROR_NETWORK_FAILURE**
+    ///
+    /// Network connecting or proxy setting issue was encountered.
+    ///
+    /// **SGX_ERROR_OUT_OF_MEMORY**
+    ///
+    /// Not enough memory is available to complete this operation.
+    ///
+    /// **SGX_ERROR_OUT_OF_EPC**
+    ///
+    /// There is not enough EPC memory to load one of the Architecture Enclaves needed to complete this operation.
+    ///
+    /// **SGX_ERROR_UNEXPECTED**
+    ///
+    /// Indicates an unexpected error occurs.
+    ///
+    pub fn destory(&self) -> SgxError {
+
+        if self.initflag.get() == false {
+            return Err(sgx_status_t::SGX_ERROR_MC_NOT_FOUND);
+        }
+
+        let ret = rsgx_destroy_monotonic_counter(&self.counter_uuid);
+        if ret == sgx_status_t::SGX_SUCCESS {
+            self.initflag.set(false);
+            Ok(())
+        } else {
+            Err(ret)
+        }
+    }
+
+    ///
+    /// increments a monotonic counter value by 1.
+    ///
+    /// # Description
+    ///
+    /// Call increment to increase a monotonic counter value by 1.
+    ///
+    /// The caller should call rsgx_create_pse_session to establish a session with the platform service enclave
+    /// before calling this API.
+    ///
+    /// increment fails if the calling enclave does not match the owner policy and the attributes specified in the
+    /// call that created the monotonic counter.
+    ///
+    /// Incrementing a monotonic counter (MC) involves writing to the non-volatile memory available in the platform.
+    /// Repeated write operations could cause the memory to wear out during the normal lifecycle of the platform.
+    /// Intel(R) SGX prevents this by limiting the rate at which MC operations can be performed. If you exceed the limit,
+    /// the MC operation may return SGX_ERROR_BUSY for several minutes.
+    ///
+    /// # Requirements
+    ///
+    /// Header: sgx_tae_service.edl
+    ///
+    /// Library: libsgx_tservice.a
+    ///
+    /// # Errors
+    ///
+    /// **SGX_ERROR_INVALID_PARAMETER**
+    ///
+    /// Any of the pointers is invalid.
+    ///
+    /// **SGX_ERROR_BUSY**
+    ///
+    /// The requested service is temporarily not available.
+    ///
+    /// **SGX_ERROR_MC_NOT_FOUND**
+    ///
+    /// The Monotonic Counter does not exist or has been invalidated.
+    ///
+    /// **SGX_ERROR_MC_NO_ACCESS_RIGHT**
+    ///
+    /// The enclave doesn't have the access right to specified Monotonic Counter.
+    ///
+    /// **SGX_ERROR_AE_SESSION_INVALID**
+    ///
+    /// Session is not created or has been closed by architectural enclave service.
+    ///
+    /// **SGX_ERROR_SERVICE_UNAVAILABLE**
+    ///
+    /// The AE service did not respond or the requested service is not supported.
+    ///
+    /// **SGX_ERROR_SERVICE_TIMEOUT**
+    ///
+    /// A request to the AE service timed out.
+    ///
+    /// **SGX_ERROR_NETWORK_FAILURE**
+    ///
+    /// Network connecting or proxy setting issue was encountered.
+    ///
+    /// **SGX_ERROR_OUT_OF_MEMORY**
+    ///
+    /// Not enough memory is available to complete this operation.
+    ///
+    /// **SGX_ERROR_OUT_OF_EPC**
+    ///
+    /// There is not enough EPC memory to load one of the Architecture Enclaves needed to complete this operation.
+    ///
+    /// **SGX_ERROR_UNEXPECTED**
+    ///
+    /// Indicates an unexpected error occurs.
+    ///
+    pub fn increment(&self) -> SgxResult<u32> {
+
+        if self.initflag.get() == false {
+            return Err(sgx_status_t::SGX_ERROR_MC_NOT_FOUND);
+        }
+
+        let mut counter_value: u32 = 0;
+        let ret = rsgx_increment_monotonic_counter(&self.counter_uuid, &mut counter_value);
+         match ret {
+            sgx_status_t::SGX_SUCCESS => Ok(counter_value),
+            _ => Err(ret),
+        }
+    }
+
+    ///
+    /// returns the value of a monotonic counter.
+    ///
+    /// # Description
+    ///
+    /// Call read to read the value of a monotonic counter.
+    ///
+    /// The caller should call rsgx_create_pse_session to establish a session with the platform service enclave
+    /// before calling this API.
+    ///
+    /// read fails if the calling enclave does not match the owner policy and the attributes specified in the
+    /// call that created the monotonic counter.
+    ///
+    /// # Requirements
+    ///
+    /// Header: sgx_tae_service.edl
+    ///
+    /// Library: libsgx_tservice.a
+    ///
+    /// # Return value
+    ///
+    /// Monotonic counter value
+    ///
+    /// # Errors
+    ///
+    /// **SGX_ERROR_INVALID_PARAMETER**
+    ///
+    /// Any of the pointers is invalid.
+    ///
+    /// **SGX_ERROR_MC_NOT_FOUND**
+    ///
+    /// The Monotonic Counter does not exist or has been invalidated.
+    ///
+    /// **SGX_ERROR_AE_SESSION_INVALID**
+    ///
+    /// Session is not created or has been closed by architectural enclave service.
+    ///
+    /// **SGX_ERROR_SERVICE_UNAVAILABLE**
+    ///
+    /// The AE service did not respond or the requested service is not supported.
+    ///
+    /// **SGX_ERROR_SERVICE_TIMEOUT**
+    ///
+    /// A request to the AE service timed out.
+    ///
+    /// **SGX_ERROR_NETWORK_FAILURE**
+    ///
+    /// Network connecting or proxy setting issue was encountered.
+    ///
+    /// **SGX_ERROR_OUT_OF_MEMORY**
+    ///
+    /// Not enough memory is available to complete this operation.
+    ///
+    /// **SGX_ERROR_OUT_OF_EPC**
+    ///
+    /// There is not enough EPC memory to load one of the Architecture Enclaves needed to complete this operation.
+    ///
+    /// **SGX_ERROR_UNEXPECTED**
+    ///
+    /// Indicates an unexpected error occurs.
+    ///
+    pub fn read(&self) -> SgxResult<u32> {
+
+        if self.initflag.get() == false {
+            return Err(sgx_status_t::SGX_ERROR_MC_NOT_FOUND);
+        }
+
+        let mut counter_value: u32 = 0;
+        let ret = rsgx_read_monotonic_counter(&self.counter_uuid, &mut counter_value);
+        match ret {
+            sgx_status_t::SGX_SUCCESS => Ok(counter_value),
+            _ => Err(ret),
+        }
+    }
+}
+
+impl Drop for SgxMonotonicCounter {
+    ///
+    /// destroys a monotonic counter created by new or new_ex.
+    ///
+    fn drop(&mut self) {
+        let _ = self.destory();
+    }
+}
+
+fn rsgx_create_monotonic_counter_ex(owner_policy: u16,
+                                    owner_attribute_mask: &sgx_attributes_t,
+                                    counter_uuid: &mut sgx_mc_uuid_t,
+                                    counter_value: &mut u32) -> sgx_status_t {
+
+    unsafe {
+        sgx_create_monotonic_counter_ex(owner_policy,
+                                        owner_attribute_mask as * const sgx_attributes_t,
+                                        counter_uuid as * mut sgx_mc_uuid_t,
+                                        counter_value as * mut u32)
+    }
+}
+
+fn rsgx_create_monotonic_counter(counter_uuid: &mut sgx_mc_uuid_t, counter_value: &mut u32) -> sgx_status_t {
+
+    unsafe {
+        sgx_create_monotonic_counter(counter_uuid as * mut sgx_mc_uuid_t, counter_value as * mut u32)
+    }
+}
+
+fn rsgx_destroy_monotonic_counter(counter_uuid: &sgx_mc_uuid_t) -> sgx_status_t {
+
+    unsafe {
+        sgx_destroy_monotonic_counter(counter_uuid as * const sgx_mc_uuid_t)
+    }
+}
+
+fn rsgx_increment_monotonic_counter(counter_uuid: &sgx_mc_uuid_t, counter_value: &mut u32) -> sgx_status_t {
+
+    unsafe {
+        sgx_increment_monotonic_counter(counter_uuid as * const sgx_mc_uuid_t, counter_value as * mut u32)
+    }
+}
+
+fn rsgx_read_monotonic_counter(counter_uuid: &sgx_mc_uuid_t, counter_value: &mut u32) -> sgx_status_t {
+
+    unsafe {
+        sgx_read_monotonic_counter(counter_uuid as * const sgx_mc_uuid_t, counter_value as * mut u32)
+    }
+}
\ No newline at end of file
diff --git a/sgx_tservice/src/sgxtime.rs b/sgx_tservice/src/sgxtime.rs
new file mode 100644
index 0000000..a931e34
--- /dev/null
+++ b/sgx_tservice/src/sgxtime.rs
@@ -0,0 +1,214 @@
+// Copyright (C) 2017-2018 Baidu, Inc. All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//  * Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in
+//    the documentation and/or other materials provided with the
+//    distribution.
+//  * Neither the name of Baidu, Inc., nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+use sgx_types::*;
+use core::cmp::Ordering;
+use core::fmt;
+
+/// timestamp contains time in seconds and source_nonce contains nonce associate with the time.
+#[derive(Copy, Clone, Debug, Default)]
+pub struct SgxTime {
+    timestamp: sgx_time_t,
+    source_nonce: sgx_time_source_nonce_t,
+}
+
+pub type Duration = sgx_time_t;
+
+pub enum SgxTimeError {
+    TimeStamp(Duration),
+    TimeSourceChanged,
+    SgxStatus(sgx_status_t),
+}
+
+impl SgxTimeError {
+    pub fn __description(&self) -> &str {
+        match *self {
+           SgxTimeError::TimeStamp(_) => "other time was not earlier than self",
+           SgxTimeError::TimeSourceChanged => "time source is changed",
+           SgxTimeError::SgxStatus(ref status) => status.__description(),
+        }
+    }
+}
+
+impl fmt::Display for SgxTimeError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+           SgxTimeError::TimeStamp(_) => write!(f, "second time provided was later than self"),
+           SgxTimeError::TimeSourceChanged => write!(f, "time source does not match"),
+           SgxTimeError::SgxStatus(status) => status.fmt(f),
+        }
+    }
+}
+
+impl PartialEq for SgxTime {
+    fn eq(&self, other: &SgxTime) -> bool {
+        self.timestamp == other.timestamp && self.source_nonce == other.source_nonce
+    }
+}
+
+impl Eq for SgxTime {}
+
+impl PartialOrd for SgxTime {
+
+    fn partial_cmp(&self, other: &SgxTime) -> Option<Ordering> {
+        
+        if self.source_nonce == other.source_nonce {
+            Some(self.timestamp.cmp(&other.timestamp))
+        } else {
+            None
+        }
+    }
+}
+
+impl SgxTime {
+
+    pub fn now() -> Result<SgxTime, SgxTimeError> {
+
+        let mut timestamp: sgx_time_t = 0;
+        let mut source_nonce: sgx_time_source_nonce_t = Default::default();
+
+        let ret = rsgx_get_trusted_time(&mut timestamp, &mut source_nonce);
+        match ret {
+            sgx_status_t::SGX_SUCCESS => Ok(SgxTime{ 
+                                            timestamp: timestamp, 
+                                            source_nonce: source_nonce 
+                                         }),
+            _ => Err(SgxTimeError::SgxStatus(ret)),
+        }
+    }
+
+    pub fn duration_since(&self, earlier: &SgxTime) -> Result<Duration, SgxTimeError> {
+
+        if self.source_nonce == earlier.source_nonce {
+
+            if self.timestamp >= earlier.timestamp {
+                Ok(self.timestamp - earlier.timestamp)
+            } else {
+                Err(SgxTimeError::TimeStamp(earlier.timestamp - self.timestamp))
+            }
+        } else {
+            Err(SgxTimeError::TimeSourceChanged)
+        }
+    }
+
+    pub fn elapsed(&self) -> Result<Duration, SgxTimeError> {
+
+        SgxTime::now().and_then(|t| t.duration_since(self))
+    }
+
+    pub fn add_duration(&self, other: Duration) -> Option<SgxTime> {
+
+        self.timestamp.checked_add(other).map(|secs|
+            SgxTime{ timestamp: secs, source_nonce: self.source_nonce }
+        )
+    }
+
+    pub fn sub_duration(&self, other: Duration) -> Option<SgxTime> {
+
+        self.timestamp.checked_sub(other).map(|secs|
+            SgxTime{ timestamp: secs, source_nonce: self.source_nonce }
+        )
+    }
+
+    pub fn get_secs(&self) -> sgx_time_t { self.timestamp }
+
+    pub fn get_source_nonce(&self) -> sgx_time_source_nonce_t { self.source_nonce }
+}
+
+///
+/// rsgx_get_trusted_time gets trusted time from the AE service.
+///
+/// # Description
+///
+/// current_time contains time in seconds and time_source_nonce contains nonce associate with the time.
+/// The caller should compare time_source_nonce against the value returned from the previous call of
+/// this API if it needs to calculate the time passed between two readings of the Trusted Timer. If the
+/// time_source_nonce of the two readings do not match, the difference between the two readings does not
+/// necessarily reflect time passed.
+///
+/// The caller should call rsgx_create_pse_session to establish a session with the platform service enclave
+/// before calling this API.
+///
+/// # Parameters
+///
+/// **current_time**
+///
+/// Trusted Time Stamp in seconds relative to a reference point. The reference point does not change as long as
+/// the time_source_nonce has not changed.
+///
+/// **time_source_nonce**
+///
+/// A pointer to the buffer that receives the nonce which indicates time source.
+///
+/// # Requirements
+///
+/// Header: sgx_tae_service.edl
+///
+/// Library: libsgx_tservice.a
+///
+/// # Errors
+///
+/// **SGX_ERROR_INVALID_PARAMETER**
+///
+/// Any of the pointers is invalid.
+///
+/// **SGX_ERROR_AE_SESSION_INVALID**
+///
+/// Session is not created or has been closed by architectural enclave service.
+///
+/// **SGX_ERROR_SERVICE_UNAVAILABLE**
+///
+/// The AE service did not respond or the requested service is not supported.
+///
+/// **SGX_ERROR_SERVICE_TIMEOUT**
+///
+/// A request to the AE service timed out.
+///
+/// **SGX_ERROR_NETWORK_FAILURE**
+///
+/// Network connecting or proxy setting issue was encountered.
+///
+/// **SGX_ERROR_OUT_OF_MEMORY**
+///
+/// Not enough memory is available to complete this operation.
+///
+/// **SGX_ERROR_OUT_OF_EPC**
+///
+/// There is not enough EPC memory to load one of the Architecture Enclaves needed to complete this operation.
+///
+/// **SGX_ERROR_UNEXPECTED**
+///
+/// Indicates an unexpected error occurs.
+///
+fn rsgx_get_trusted_time(current_time: &mut sgx_time_t,
+                         time_source_nonce: &mut sgx_time_source_nonce_t) -> sgx_status_t {
+
+    unsafe { 
+        sgx_get_trusted_time(current_time as * mut sgx_time_t, time_source_nonce as * mut sgx_time_source_nonce_t) 
+    }
+}
\ No newline at end of file
diff --git a/sgx_tservice/src/tae.rs b/sgx_tservice/src/tae.rs
index 44d02e6..49e6e77 100644
--- a/sgx_tservice/src/tae.rs
+++ b/sgx_tservice/src/tae.rs
@@ -32,9 +32,6 @@
 //! to use platform services and get platform services security property.
 //!
 use sgx_types::*;
-use core::cell::Cell;
-use core::cmp::Ordering;
-use core::fmt;
 
 ///
 /// rsgx_create_pse_session creates a session with the PSE.
@@ -212,696 +209,4 @@
     }
 }
 
-///
-/// rsgx_get_trusted_time gets trusted time from the AE service.
-///
-/// # Description
-///
-/// current_time contains time in seconds and time_source_nonce contains nonce associate with the time.
-/// The caller should compare time_source_nonce against the value returned from the previous call of
-/// this API if it needs to calculate the time passed between two readings of the Trusted Timer. If the
-/// time_source_nonce of the two readings do not match, the difference between the two readings does not
-/// necessarily reflect time passed.
-///
-/// The caller should call rsgx_create_pse_session to establish a session with the platform service enclave
-/// before calling this API.
-///
-/// # Parameters
-///
-/// **current_time**
-///
-/// Trusted Time Stamp in seconds relative to a reference point. The reference point does not change as long as
-/// the time_source_nonce has not changed.
-///
-/// **time_source_nonce**
-///
-/// A pointer to the buffer that receives the nonce which indicates time source.
-///
-/// # Requirements
-///
-/// Header: sgx_tae_service.edl
-///
-/// Library: libsgx_tservice.a
-///
-/// # Errors
-///
-/// **SGX_ERROR_INVALID_PARAMETER**
-///
-/// Any of the pointers is invalid.
-///
-/// **SGX_ERROR_AE_SESSION_INVALID**
-///
-/// Session is not created or has been closed by architectural enclave service.
-///
-/// **SGX_ERROR_SERVICE_UNAVAILABLE**
-///
-/// The AE service did not respond or the requested service is not supported.
-///
-/// **SGX_ERROR_SERVICE_TIMEOUT**
-///
-/// A request to the AE service timed out.
-///
-/// **SGX_ERROR_NETWORK_FAILURE**
-///
-/// Network connecting or proxy setting issue was encountered.
-///
-/// **SGX_ERROR_OUT_OF_MEMORY**
-///
-/// Not enough memory is available to complete this operation.
-///
-/// **SGX_ERROR_OUT_OF_EPC**
-///
-/// There is not enough EPC memory to load one of the Architecture Enclaves needed to complete this operation.
-///
-/// **SGX_ERROR_UNEXPECTED**
-///
-/// Indicates an unexpected error occurs.
-///
-fn rsgx_get_trusted_time(current_time: &mut sgx_time_t,
-                         time_source_nonce: &mut sgx_time_source_nonce_t) -> sgx_status_t {
 
-    unsafe { 
-        sgx_get_trusted_time(current_time as * mut sgx_time_t, time_source_nonce as * mut sgx_time_source_nonce_t) 
-    }
-}
-
-/// timestamp contains time in seconds and source_nonce contains nonce associate with the time.
-#[derive(Copy, Clone, Debug, Default)]
-pub struct SgxTime {
-    timestamp: sgx_time_t,
-    source_nonce: sgx_time_source_nonce_t,
-}
-
-pub type Duration = sgx_time_t;
-
-pub enum SgxTimeError {
-    TimeStamp(Duration),
-    TimeSourceChanged,
-    SgxStatus(sgx_status_t),
-}
-
-impl SgxTimeError {
-    pub fn __description(&self) -> &str {
-        match *self {
-           SgxTimeError::TimeStamp(_) => "other time was not earlier than self",
-           SgxTimeError::TimeSourceChanged => "time source is changed",
-           SgxTimeError::SgxStatus(ref status) => status.__description(),
-        }
-    }
-}
-
-impl fmt::Display for SgxTimeError {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-           SgxTimeError::TimeStamp(_) => write!(f, "second time provided was later than self"),
-           SgxTimeError::TimeSourceChanged => write!(f, "time source does not match"),
-           SgxTimeError::SgxStatus(status) => status.fmt(f),
-        }
-    }
-}
-
-impl PartialEq for SgxTime {
-    fn eq(&self, other: &SgxTime) -> bool {
-        self.timestamp == other.timestamp && self.source_nonce == other.source_nonce
-    }
-}
-
-impl Eq for SgxTime {}
-
-impl PartialOrd for SgxTime {
-
-    fn partial_cmp(&self, other: &SgxTime) -> Option<Ordering> {
-        
-        if self.source_nonce == other.source_nonce {
-            Some(self.timestamp.cmp(&other.timestamp))
-        } else {
-            None
-        }
-    }
-}
-
-impl SgxTime {
-
-    pub fn now() -> Result<SgxTime, SgxTimeError> {
-
-        let mut timestamp: sgx_time_t = 0;
-        let mut source_nonce: sgx_time_source_nonce_t = Default::default();
-
-        let ret = rsgx_get_trusted_time(&mut timestamp, &mut source_nonce);
-        match ret {
-            sgx_status_t::SGX_SUCCESS => Ok(SgxTime{ 
-                                            timestamp: timestamp, 
-                                            source_nonce: source_nonce 
-                                         }),
-            _ => Err(SgxTimeError::SgxStatus(ret)),
-        }
-    }
-
-    pub fn duration_since(&self, earlier: &SgxTime) -> Result<Duration, SgxTimeError> {
-
-        if self.source_nonce == earlier.source_nonce {
-
-            if self.timestamp >= earlier.timestamp {
-                Ok(self.timestamp - earlier.timestamp)
-            } else {
-                Err(SgxTimeError::TimeStamp(earlier.timestamp - self.timestamp))
-            }
-        } else {
-            Err(SgxTimeError::TimeSourceChanged)
-        }
-    }
-
-    pub fn elapsed(&self) -> Result<Duration, SgxTimeError> {
-
-        SgxTime::now().and_then(|t| t.duration_since(self))
-    }
-
-    pub fn add_duration(&self, other: Duration) -> Option<SgxTime> {
-
-        self.timestamp.checked_add(other).map(|secs|
-            SgxTime{ timestamp: secs, source_nonce: self.source_nonce }
-        )
-    }
-
-    pub fn sub_duration(&self, other: Duration) -> Option<SgxTime> {
-
-        self.timestamp.checked_sub(other).map(|secs|
-            SgxTime{ timestamp: secs, source_nonce: self.source_nonce }
-        )
-    }
-
-    pub fn get_secs(&self) -> sgx_time_t { self.timestamp }
-
-    pub fn get_source_nonce(&self) -> sgx_time_source_nonce_t { self.source_nonce }
-}
-
-fn rsgx_create_monotonic_counter_ex(owner_policy: u16,
-                                    owner_attribute_mask: &sgx_attributes_t,
-                                    counter_uuid: &mut sgx_mc_uuid_t,
-                                    counter_value: &mut u32) -> sgx_status_t {
-
-    unsafe {
-        sgx_create_monotonic_counter_ex(owner_policy,
-                                        owner_attribute_mask as * const sgx_attributes_t,
-                                        counter_uuid as * mut sgx_mc_uuid_t,
-                                        counter_value as * mut u32)
-    }
-}
-
-fn rsgx_create_monotonic_counter(counter_uuid: &mut sgx_mc_uuid_t, counter_value: &mut u32) -> sgx_status_t {
-
-    unsafe {
-        sgx_create_monotonic_counter(counter_uuid as * mut sgx_mc_uuid_t, counter_value as * mut u32)
-    }
-}
-
-fn rsgx_destroy_monotonic_counter(counter_uuid: &sgx_mc_uuid_t) -> sgx_status_t {
-
-    unsafe {
-        sgx_destroy_monotonic_counter(counter_uuid as * const sgx_mc_uuid_t)
-    }
-}
-
-fn rsgx_increment_monotonic_counter(counter_uuid: &sgx_mc_uuid_t, counter_value: &mut u32) -> sgx_status_t {
-
-    unsafe {
-        sgx_increment_monotonic_counter(counter_uuid as * const sgx_mc_uuid_t, counter_value as * mut u32)
-    }
-}
-
-fn rsgx_read_monotonic_counter(counter_uuid: &sgx_mc_uuid_t, counter_value: &mut u32) -> sgx_status_t {
-
-    unsafe {
-        sgx_read_monotonic_counter(counter_uuid as * const sgx_mc_uuid_t, counter_value as * mut u32)
-    }
-}
-
-/// Monotonic counter ID
-pub struct SgxMonotonicCounter {
-    counter_uuid: sgx_mc_uuid_t,
-    initflag: Cell<bool>,
-}
-
-impl SgxMonotonicCounter {
-
-    ///
-    /// creates a monotonic counter with default owner policy and default user attribute mask.
-    ///
-    /// # Description
-    ///
-    /// Call new to create a monotonic counter with the default owner policy 0x1, which means enclaves
-    /// with same signing key can access the monotonic counter and default owner_attribute_mask 0xFFFFFFFFFFFFFFCB.
-    ///
-    /// The caller should call rsgx_create_pse_session to establish a session with the platform service enclave
-    /// before calling this API.
-    ///
-    /// Creating a monotonic counter (MC) involves writing to the non-volatile memory available in the platform.
-    /// Repeated write operations could cause the memory to wear out during the normal lifecycle of the platform.
-    /// Intel(R) SGX prevents this by limiting the rate at which MC operations can be performed. If you exceed
-    /// the limit, the MC operation may return SGX_ERROR_BUSY for several minutes.
-    ///
-    /// Intel(R) SGX limits the number of MCs an enclave can create. To avoid exhausting the available quota,
-    /// an SGX application should record the MC UUID that rsgx_create_monotonic_counter returns and destroy a MC
-    /// when it is not needed any more. If an enclave reaches its quota and previously created MC UUIDs have not
-    /// been recorded, you may restore the MC service after uninstalling the SGX PSW and installing it again.
-    /// This procedure deletes all MCs created by any enclave in that system.
-    ///
-    /// # Parameters
-    ///
-    /// **counter_value**
-    ///
-    /// A pointer to the buffer that receives the monotonic counter value.
-    ///
-    /// # Requirements
-    ///
-    /// Header: sgx_tae_service.edl
-    ///
-    /// Library: libsgx_tservice.a
-    ///
-    /// # Return value
-    ///
-    /// Monotonic counter ID
-    ///
-    /// # Errors
-    ///
-    /// **SGX_ERROR_INVALID_PARAMETER**
-    ///
-    /// Any of the pointers is invalid.
-    ///
-    /// **SGX_ERROR_BUSY**
-    ///
-    /// The requested service is temporarily not available.
-    ///
-    /// **SGX_ERROR_MC_OVER_QUOTA**
-    ///
-    /// The enclave has reached the quota of Monotonic Counters it can maintain.
-    ///
-    /// **SGX_ERROR_MC_USED_UP**
-    ///
-    /// Monotonic counters are used out.
-    ///
-    /// **SGX_ERROR_AE_SESSION_INVALID**
-    ///
-    /// Session is not created or has been closed by architectural enclave service.
-    ///
-    /// **SGX_ERROR_SERVICE_UNAVAILABLE**
-    ///
-    /// The AE service did not respond or the requested service is not supported.
-    ///
-    /// **SGX_ERROR_SERVICE_TIMEOUT**
-    ///
-    /// A request to the AE service timed out.
-    ///
-    /// **SGX_ERROR_NETWORK_FAILURE**
-    ///
-    /// Network connecting or proxy setting issue was encountered.
-    ///
-    /// **SGX_ERROR_OUT_OF_MEMORY**
-    ///
-    /// Not enough memory is available to complete this operation.
-    ///
-    /// **SGX_ERROR_OUT_OF_EPC**
-    ///
-    /// There is not enough EPC memory to load one of the Architecture Enclaves needed to complete this operation.
-    ///
-    /// **SGX_ERROR_UNEXPECTED**
-    ///
-    /// Indicates an unexpected error occurs.
-    ///
-    pub fn new(counter_value: &mut u32) -> SgxResult<Self> {
-
-        let mut counter_uuid = sgx_mc_uuid_t::default();
-        let ret = rsgx_create_monotonic_counter(&mut counter_uuid, counter_value);
-
-        match ret {
-            sgx_status_t::SGX_SUCCESS => Ok(SgxMonotonicCounter{
-                                            counter_uuid: counter_uuid, 
-                                            initflag: Cell::new(true),
-                                         }),
-            _ => Err(ret),
-        }
-    }
-
-    ///
-    /// creates a monotonic counter.
-    ///
-    /// # Description
-    ///
-    /// Call new_ex to create a monotonic counter with the given owner_policy and owner_attribute_mask.
-    ///
-    /// The caller should call rsgx_create_pse_session to establish a session with the platform service enclave
-    /// before calling this API.
-    ///
-    /// Creating a monotonic counter (MC) involves writing to the non-volatile memory available in the platform.
-    /// Repeated write operations could cause the memory to wear out during the normal lifecycle of the platform.
-    /// Intel(R) SGX prevents this by limiting the rate at which MC operations can be performed. If you exceed
-    /// the limit, the MC operation may return SGX_ERROR_BUSY for several minutes.
-    ///
-    /// Intel(R) SGX limits the number of MCs an enclave can create. To avoid exhausting the available quota,
-    /// an SGX application should record the MC UUID that rsgx_create_monotonic_counter_ex returns and destroy a MC
-    /// when it is not needed any more. If an enclave reaches its quota and previously created MC UUIDs have not
-    /// been recorded, you may restore the MC service after uninstalling the SGX PSW and installing it again.
-    /// This procedure deletes all MCs created by any enclave in that system.
-    ///
-    /// # Parameters
-    ///
-    /// **owner_policy**
-    ///
-    /// The owner policy of the monotonic counter.
-    ///
-    /// * 0x1 means enclave with same signing key can access the monotonic counter
-    /// * 0x2 means enclave with same measurement can access the monotonic counter
-    /// * 0x3 means enclave with same measurement as well as signing key can access the monotonic counter.
-    /// * Owner policy values of 0x0 or any bits set beyond bits 0 and 1 will cause SGX_ERROR_INVALID_PARAMETER
-    ///
-    /// **owner_attribute_mask**
-    ///
-    /// Mask of owner attribute, in the format of sgx_attributes_t.
-    ///
-    /// **counter_value**
-    ///
-    /// A pointer to the buffer that receives the monotonic counter value.
-    ///
-    /// # Requirements
-    ///
-    /// Header: sgx_tae_service.edl
-    ///
-    /// Library: libsgx_tservice.a
-    ///
-    /// # Return value
-    ///
-    /// Monotonic counter ID
-    ///
-    /// # Errors
-    ///
-    /// **SGX_ERROR_INVALID_PARAMETER**
-    ///
-    /// Any of the pointers is invalid.
-    ///
-    /// **SGX_ERROR_BUSY**
-    ///
-    /// The requested service is temporarily not available.
-    ///
-    /// **SGX_ERROR_MC_OVER_QUOTA**
-    ///
-    /// The enclave has reached the quota of Monotonic Counters it can maintain.
-    ///
-    /// **SGX_ERROR_MC_USED_UP**
-    ///
-    /// Monotonic counters are used out.
-    ///
-    /// **SGX_ERROR_AE_SESSION_INVALID**
-    ///
-    /// Session is not created or has been closed by architectural enclave service.
-    ///
-    /// **SGX_ERROR_SERVICE_UNAVAILABLE**
-    ///
-    /// The AE service did not respond or the requested service is not supported.
-    ///
-    /// **SGX_ERROR_SERVICE_TIMEOUT**
-    ///
-    /// A request to the AE service timed out.
-    ///
-    /// **SGX_ERROR_NETWORK_FAILURE**
-    ///
-    /// Network connecting or proxy setting issue was encountered.
-    ///
-    /// **SGX_ERROR_OUT_OF_MEMORY**
-    ///
-    /// Not enough memory is available to complete this operation.
-    ///
-    /// **SGX_ERROR_OUT_OF_EPC**
-    ///
-    /// There is not enough EPC memory to load one of the Architecture Enclaves needed to complete this operation.
-    ///
-    /// **SGX_ERROR_UNEXPECTED**
-    ///
-    /// Indicates an unexpected error occurs.
-    ///
-    pub fn new_ex(owner_policy: u16, owner_attribute_mask: &sgx_attributes_t, counter_value: &mut u32) -> SgxResult<Self> {
-
-        let mut counter_uuid = sgx_mc_uuid_t::default();
-        let ret = rsgx_create_monotonic_counter_ex(owner_policy, owner_attribute_mask, &mut counter_uuid, counter_value);
-
-        match ret {
-            sgx_status_t::SGX_SUCCESS => Ok(SgxMonotonicCounter{
-                                            counter_uuid: counter_uuid, 
-                                            initflag: Cell::new(true),
-                                         }),
-            _ => Err(ret),
-        }
-    }
-
-    ///
-    /// destroys a monotonic counter created by new or new_ex.
-    ///
-    /// # Description
-    ///
-    /// Calling destory after a monotonic counter is not needed anymore.
-    ///
-    /// The caller should call rsgx_create_pse_session to establish a session with the platform service enclave
-    /// before calling this API.
-    ///
-    /// destory fails if the calling enclave does not match the owner policy and the attributes specified in the
-    /// call that created the monotonic counter.
-    ///
-    /// Destroying a Monotonic Counter (MC) involves writing to the non-volatile memory available in the platform.
-    /// Repeated write operations could cause the memory to wear out during the normal lifecycle of the platform.
-    /// Intel(R) SGX prevents this by limiting the rate at which MC operations can be performed. If you exceed the
-    /// limit, the MC operation may return SGX_ERROR_BUSY for several minutes.
-    ///
-    /// # Requirements
-    ///
-    /// Header: sgx_tae_service.edl
-    ///
-    /// Library: libsgx_tservice.a
-    ///
-    /// # Errors
-    ///
-    /// **SGX_ERROR_INVALID_PARAMETER**
-    ///
-    /// Any of the pointers is invalid.
-    ///
-    /// **SGX_ERROR_BUSY**
-    ///
-    /// The requested service is temporarily not available.
-    ///
-    /// **SGX_ERROR_MC_NOT_FOUND**
-    ///
-    /// The Monotonic Counter does not exist or has been invalidated.
-    ///
-    /// **SGX_ERROR_MC_NO_ACCESS_RIGHT**
-    ///
-    /// The enclave doesn't have the access right to specified Monotonic Counter.
-    ///
-    /// **SGX_ERROR_AE_SESSION_INVALID**
-    ///
-    /// Session is not created or has been closed by architectural enclave service.
-    ///
-    /// **SGX_ERROR_SERVICE_UNAVAILABLE**
-    ///
-    /// The AE service did not respond or the requested service is not supported.
-    ///
-    /// **SGX_ERROR_SERVICE_TIMEOUT**
-    ///
-    /// A request to the AE service timed out.
-    ///
-    /// **SGX_ERROR_NETWORK_FAILURE**
-    ///
-    /// Network connecting or proxy setting issue was encountered.
-    ///
-    /// **SGX_ERROR_OUT_OF_MEMORY**
-    ///
-    /// Not enough memory is available to complete this operation.
-    ///
-    /// **SGX_ERROR_OUT_OF_EPC**
-    ///
-    /// There is not enough EPC memory to load one of the Architecture Enclaves needed to complete this operation.
-    ///
-    /// **SGX_ERROR_UNEXPECTED**
-    ///
-    /// Indicates an unexpected error occurs.
-    ///
-    pub fn destory(&self) -> SgxError {
-
-        if self.initflag.get() == false {
-            return Err(sgx_status_t::SGX_ERROR_MC_NOT_FOUND);
-        }
-
-        let ret = rsgx_destroy_monotonic_counter(&self.counter_uuid);
-        if ret == sgx_status_t::SGX_SUCCESS {
-            self.initflag.set(false);
-            Ok(())
-        } else {
-            Err(ret)
-        }
-    }
-
-    ///
-    /// increments a monotonic counter value by 1.
-    ///
-    /// # Description
-    ///
-    /// Call increment to increase a monotonic counter value by 1.
-    ///
-    /// The caller should call rsgx_create_pse_session to establish a session with the platform service enclave
-    /// before calling this API.
-    ///
-    /// increment fails if the calling enclave does not match the owner policy and the attributes specified in the
-    /// call that created the monotonic counter.
-    ///
-    /// Incrementing a monotonic counter (MC) involves writing to the non-volatile memory available in the platform.
-    /// Repeated write operations could cause the memory to wear out during the normal lifecycle of the platform.
-    /// Intel(R) SGX prevents this by limiting the rate at which MC operations can be performed. If you exceed the limit,
-    /// the MC operation may return SGX_ERROR_BUSY for several minutes.
-    ///
-    /// # Requirements
-    ///
-    /// Header: sgx_tae_service.edl
-    ///
-    /// Library: libsgx_tservice.a
-    ///
-    /// # Errors
-    ///
-    /// **SGX_ERROR_INVALID_PARAMETER**
-    ///
-    /// Any of the pointers is invalid.
-    ///
-    /// **SGX_ERROR_BUSY**
-    ///
-    /// The requested service is temporarily not available.
-    ///
-    /// **SGX_ERROR_MC_NOT_FOUND**
-    ///
-    /// The Monotonic Counter does not exist or has been invalidated.
-    ///
-    /// **SGX_ERROR_MC_NO_ACCESS_RIGHT**
-    ///
-    /// The enclave doesn't have the access right to specified Monotonic Counter.
-    ///
-    /// **SGX_ERROR_AE_SESSION_INVALID**
-    ///
-    /// Session is not created or has been closed by architectural enclave service.
-    ///
-    /// **SGX_ERROR_SERVICE_UNAVAILABLE**
-    ///
-    /// The AE service did not respond or the requested service is not supported.
-    ///
-    /// **SGX_ERROR_SERVICE_TIMEOUT**
-    ///
-    /// A request to the AE service timed out.
-    ///
-    /// **SGX_ERROR_NETWORK_FAILURE**
-    ///
-    /// Network connecting or proxy setting issue was encountered.
-    ///
-    /// **SGX_ERROR_OUT_OF_MEMORY**
-    ///
-    /// Not enough memory is available to complete this operation.
-    ///
-    /// **SGX_ERROR_OUT_OF_EPC**
-    ///
-    /// There is not enough EPC memory to load one of the Architecture Enclaves needed to complete this operation.
-    ///
-    /// **SGX_ERROR_UNEXPECTED**
-    ///
-    /// Indicates an unexpected error occurs.
-    ///
-    pub fn increment(&self) -> SgxResult<u32> {
-
-        if self.initflag.get() == false {
-            return Err(sgx_status_t::SGX_ERROR_MC_NOT_FOUND);
-        }
-
-        let mut counter_value: u32 = 0;
-        let ret = rsgx_increment_monotonic_counter(&self.counter_uuid, &mut counter_value);
-         match ret {
-            sgx_status_t::SGX_SUCCESS => Ok(counter_value),
-            _ => Err(ret),
-        }
-    }
-
-    ///
-    /// returns the value of a monotonic counter.
-    ///
-    /// # Description
-    ///
-    /// Call read to read the value of a monotonic counter.
-    ///
-    /// The caller should call rsgx_create_pse_session to establish a session with the platform service enclave
-    /// before calling this API.
-    ///
-    /// read fails if the calling enclave does not match the owner policy and the attributes specified in the
-    /// call that created the monotonic counter.
-    ///
-    /// # Requirements
-    ///
-    /// Header: sgx_tae_service.edl
-    ///
-    /// Library: libsgx_tservice.a
-    ///
-    /// # Return value
-    ///
-    /// Monotonic counter value
-    ///
-    /// # Errors
-    ///
-    /// **SGX_ERROR_INVALID_PARAMETER**
-    ///
-    /// Any of the pointers is invalid.
-    ///
-    /// **SGX_ERROR_MC_NOT_FOUND**
-    ///
-    /// The Monotonic Counter does not exist or has been invalidated.
-    ///
-    /// **SGX_ERROR_AE_SESSION_INVALID**
-    ///
-    /// Session is not created or has been closed by architectural enclave service.
-    ///
-    /// **SGX_ERROR_SERVICE_UNAVAILABLE**
-    ///
-    /// The AE service did not respond or the requested service is not supported.
-    ///
-    /// **SGX_ERROR_SERVICE_TIMEOUT**
-    ///
-    /// A request to the AE service timed out.
-    ///
-    /// **SGX_ERROR_NETWORK_FAILURE**
-    ///
-    /// Network connecting or proxy setting issue was encountered.
-    ///
-    /// **SGX_ERROR_OUT_OF_MEMORY**
-    ///
-    /// Not enough memory is available to complete this operation.
-    ///
-    /// **SGX_ERROR_OUT_OF_EPC**
-    ///
-    /// There is not enough EPC memory to load one of the Architecture Enclaves needed to complete this operation.
-    ///
-    /// **SGX_ERROR_UNEXPECTED**
-    ///
-    /// Indicates an unexpected error occurs.
-    ///
-    pub fn read(&self) -> SgxResult<u32> {
-
-        if self.initflag.get() == false {
-            return Err(sgx_status_t::SGX_ERROR_MC_NOT_FOUND);
-        }
-
-        let mut counter_value: u32 = 0;
-        let ret = rsgx_read_monotonic_counter(&self.counter_uuid, &mut counter_value);
-        match ret {
-            sgx_status_t::SGX_SUCCESS => Ok(counter_value),
-            _ => Err(ret),
-        }
-    }
-}
-
-impl Drop for SgxMonotonicCounter {
-    ///
-    /// destroys a monotonic counter created by new or new_ex.
-    ///
-    fn drop(&mut self) {
-        let _ = self.destory();
-    }
-}
diff --git a/sgx_tstd/Cargo.toml b/sgx_tstd/Cargo.toml
index 7ccc62a..1372c66 100644
--- a/sgx_tstd/Cargo.toml
+++ b/sgx_tstd/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_tstd"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 build = "build.rs"
 
@@ -9,9 +9,12 @@
 crate-type = ["rlib"]
 
 [features]
-default = ["backtrace"]
+default = ["stdio"]
 backtrace = ["stdio"]
 stdio = []
+untrusted_fs = []
+untrusted_net = []
+untrusted_time = []
 
 [build-dependencies]
 build_helper = { path = "../build_helper" }
diff --git a/sgx_tstd/src/collections/hash/map.rs b/sgx_tstd/src/collections/hash/map.rs
index 6ed122f..b1c681e 100644
--- a/sgx_tstd/src/collections/hash/map.rs
+++ b/sgx_tstd/src/collections/hash/map.rs
@@ -1462,7 +1462,7 @@
     }
 }
 
-impl<'a, K, V> Place<V> for EntryPlace<'a, K, V> {
+unsafe impl<'a, K, V> Place<V> for EntryPlace<'a, K, V> {
     fn pointer(&mut self) -> *mut V {
         self.bucket.read_mut().1
     }
diff --git a/sgx_tstd/src/collections/hash/table.rs b/sgx_tstd/src/collections/hash/table.rs
index fd95b6f..df43dcd 100644
--- a/sgx_tstd/src/collections/hash/table.rs
+++ b/sgx_tstd/src/collections/hash/table.rs
@@ -34,7 +34,7 @@
 use core::mem::{align_of, size_of, needs_drop};
 use core::mem;
 use core::ops::{Deref, DerefMut};
-use core::ptr::{self, Unique, Shared};
+use core::ptr::{self, Unique, NonNull};
 
 use self::BucketState::*;
 
@@ -857,7 +857,7 @@
                 elems_left: elems_left,
                 marker: marker::PhantomData,
             },
-            table: Shared::from(self),
+            table: NonNull::from(self),
             marker: marker::PhantomData,
         }
     }
@@ -1004,7 +1004,7 @@
 
 /// Iterator over the entries in a table, clearing the table.
 pub struct Drain<'a, K: 'a, V: 'a> {
-    table: Shared<RawTable<K, V>>,
+    table: NonNull<RawTable<K, V>>,
     iter: RawBuckets<'static, K, V>,
     marker: marker::PhantomData<&'a RawTable<K, V>>,
 }
diff --git a/sgx_tstd/src/collections/mod.rs b/sgx_tstd/src/collections/mod.rs
index 2d1cf5f..b51511b 100644
--- a/sgx_tstd/src/collections/mod.rs
+++ b/sgx_tstd/src/collections/mod.rs
@@ -26,6 +26,14 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+//! Collection types.
+//!
+//! Rust's standard collection library provides efficient implementations of the
+//! most common general purpose programming data structures. By using the
+//! standard implementations, it should be possible for two libraries to
+//! communicate without significant data conversion.
+//!
+
 pub use alloc::Bound;
 pub use alloc::{BinaryHeap, BTreeMap, BTreeSet};
 pub use alloc::{LinkedList, VecDeque};
diff --git a/sgx_tstd/src/f32.rs b/sgx_tstd/src/f32.rs
index 06fe80e..aca1ff4 100644
--- a/sgx_tstd/src/f32.rs
+++ b/sgx_tstd/src/f32.rs
@@ -959,7 +959,7 @@
     ///
     #[inline]
     pub fn to_bits(self) -> u32 {
-        unsafe { ::mem::transmute(self) }
+        num::Float::to_bits(self)
     }
 
     /// Raw transmutation from `u32`.
@@ -994,7 +994,6 @@
     ///
     #[inline]
     pub fn from_bits(v: u32) -> Self {
-        // It turns out the safety issues with sNaN were overblown! Hooray!
-        unsafe { ::mem::transmute(v) }
+        num::Float::from_bits(v)
     }
 }
\ No newline at end of file
diff --git a/sgx_tstd/src/f64.rs b/sgx_tstd/src/f64.rs
index 435f117..3171697 100644
--- a/sgx_tstd/src/f64.rs
+++ b/sgx_tstd/src/f64.rs
@@ -906,7 +906,7 @@
     ///
     #[inline]
     pub fn to_bits(self) -> u64 {
-        unsafe { ::mem::transmute(self) }
+        num::Float::to_bits(self)
     }
 
     /// Raw transmutation from `u64`.
@@ -941,7 +941,6 @@
     ///
     #[inline]
     pub fn from_bits(v: u64) -> Self {
-        // It turns out the safety issues with sNaN were overblown! Hooray!
-        unsafe { ::mem::transmute(v) }
+        num::Float::from_bits(v)
     }
 }
diff --git a/sgx_tstd/src/fs.rs b/sgx_tstd/src/fs.rs
index 80161bb..3352f6f 100644
--- a/sgx_tstd/src/fs.rs
+++ b/sgx_tstd/src/fs.rs
@@ -100,12 +100,12 @@
 #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
 pub struct FileType(fs_imp::FileType);
 
-/// How large a buffer to pre-allocate before reading the entire file at `path`.
-fn initial_buffer_size<P: AsRef<Path>>(path: P) -> usize {
+/// How large a buffer to pre-allocate before reading the entire file.
+fn initial_buffer_size(file: &File) -> usize {
     // Allocate one extra byte so the buffer doesn't need to grow before the
     // final `read` call at the end of the file.  Don't worry about `usize`
     // overflow because reading will fail regardless in that case.
-    metadata(path).map(|m| m.len() as usize + 1).unwrap_or(0)
+    file.metadata().map(|m| m.len() as usize + 1).unwrap_or(0)
 }
 
 /// Read the entire contents of a file into a bytes vector.
@@ -129,8 +129,9 @@
 /// [`ErrorKind::Interrupted`]: ../../std/io/enum.ErrorKind.html#variant.Interrupted
 ///
 pub fn read<P: AsRef<Path>>(path: P) -> io::Result<Vec<u8>> {
-    let mut bytes = Vec::with_capacity(initial_buffer_size(&path));
-    File::open(path)?.read_to_end(&mut bytes)?;
+    let mut file = File::open(path)?;
+    let mut bytes = Vec::with_capacity(initial_buffer_size(&file));
+    file.read_to_end(&mut bytes)?;
     Ok(bytes)
 }
 
@@ -156,8 +157,9 @@
 /// [`ErrorKind::Interrupted`]: ../../std/io/enum.ErrorKind.html#variant.Interrupted
 ///
 pub fn read_string<P: AsRef<Path>>(path: P) -> io::Result<String> {
-    let mut string = String::with_capacity(initial_buffer_size(&path));
-    File::open(path)?.read_to_string(&mut string)?;
+    let mut file = File::open(path)?;
+    let mut string = String::with_capacity(initial_buffer_size(&file));
+    file.read_to_string(&mut string)?;
     Ok(string)
 }
 
diff --git a/sgx_tstd/src/lib.rs b/sgx_tstd/src/lib.rs
index 883e503..5ef66f0 100644
--- a/sgx_tstd/src/lib.rs
+++ b/sgx_tstd/src/lib.rs
@@ -47,6 +47,8 @@
 #![allow(non_camel_case_types)]
 #![allow(unused_must_use)]
 #![allow(unused_features)]
+#![allow(unused_imports)]
+#![allow(dead_code)]
 
 #![feature(alloc)]
 #![feature(global_allocator)]
@@ -80,10 +82,10 @@
 #![feature(optin_builtin_traits)]
 #![feature(placement_new_protocol)]
 #![feature(prelude_import)]
+#![feature(ptr_internals)]
 #![feature(rand)]
 #![feature(raw)]
 #![feature(rustc_attrs)]
-#![feature(shared)]
 #![feature(sip_hash_13)]
 #![feature(slice_concat_ext)]
 #![feature(str_internals)]
@@ -92,7 +94,6 @@
 #![feature(try_from)]
 #![feature(unboxed_closures)]
 #![feature(unicode)]
-#![feature(unique)]
 #![feature(untagged_unions)]
 #![feature(unwind_attributes)]
 #![feature(slice_patterns)]
@@ -198,6 +199,7 @@
 pub mod error;
 pub mod ffi;
 pub mod sgxfs;
+#[cfg(feature = "untrusted_fs")]
 pub mod fs;
 pub mod io;
 pub mod net;
diff --git a/sgx_tstd/src/net/mod.rs b/sgx_tstd/src/net/mod.rs
index e3f9ac2..d14847c 100644
--- a/sgx_tstd/src/net/mod.rs
+++ b/sgx_tstd/src/net/mod.rs
@@ -38,15 +38,19 @@
 
 pub use self::ip::{IpAddr, Ipv4Addr, Ipv6Addr, Ipv6MulticastScope};
 pub use self::addr::{SocketAddr, SocketAddrV4, SocketAddrV6, ToSocketAddrs};
+#[cfg(feature = "untrusted_net")]
 pub use self::tcp::TcpStream;
+#[cfg(feature = "untrusted_net")]
 pub use self::udp::UdpSocket;
 pub use self::parser::AddrParseError;
 
 mod ip;
 mod addr;
-mod tcp;
-mod udp;
 mod parser;
+#[cfg(feature = "untrusted_net")]
+mod tcp;
+#[cfg(feature = "untrusted_net")]
+mod udp;
 
 /// Possible values which can be passed to the [`shutdown`] method of
 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
diff --git a/sgx_tstd/src/os/mod.rs b/sgx_tstd/src/os/mod.rs
index dd8bc0e..8501496 100644
--- a/sgx_tstd/src/os/mod.rs
+++ b/sgx_tstd/src/os/mod.rs
@@ -28,4 +28,5 @@
 
 pub use sys::ext as unix;
 pub mod raw;
+#[cfg(feature = "untrusted_fs")]
 pub mod fs;
\ No newline at end of file
diff --git a/sgx_tstd/src/panic.rs b/sgx_tstd/src/panic.rs
index c85fd43..a4a68f6 100644
--- a/sgx_tstd/src/panic.rs
+++ b/sgx_tstd/src/panic.rs
@@ -33,7 +33,7 @@
 use core::cell::UnsafeCell;
 use core::fmt;
 use core::ops::{Deref, DerefMut, Fn};
-use core::ptr::{Unique, Shared};
+use core::ptr::{Unique, NonNull};
 use core::sync::atomic;
 use alloc::boxed::Box;
 use alloc::rc::Rc;
@@ -153,7 +153,7 @@
 impl<T: RefUnwindSafe + ?Sized> UnwindSafe for *const T {}
 impl<T: RefUnwindSafe + ?Sized> UnwindSafe for *mut T {}
 impl<T: UnwindSafe + ?Sized> UnwindSafe for Unique<T> {}
-impl<T: RefUnwindSafe + ?Sized> UnwindSafe for Shared<T> {}
+impl<T: RefUnwindSafe + ?Sized> UnwindSafe for NonNull<T> {}
 impl<T> UnwindSafe for AssertUnwindSafe<T> {}
 
 // not covered via the Shared impl above b/c the inner contents use
diff --git a/sgx_tstd/src/path.rs b/sgx_tstd/src/path.rs
index f69b25c..7646357 100644
--- a/sgx_tstd/src/path.rs
+++ b/sgx_tstd/src/path.rs
@@ -28,7 +28,7 @@
 
 //! Cross-platform path manipulation.
 //!
-//! This module provides two types, [`PathBuf`] and [`Path`] `Path` (akin to [`String`]
+//! This module provides two types, [`PathBuf`] and [`Path`]`Path` (akin to [`String`]
 //! and [`str`]), for working with paths abstractly. These types are thin wrappers
 //! around [`OsString`] and [`OsStr`] respectively, meaning that they work directly
 //! on strings according to the local platform's path syntax.
@@ -42,6 +42,7 @@
 //!
 
 use error::Error;
+#[cfg(feature = "untrusted_fs")]
 use fs;
 use io;
 use ffi::{OsStr, OsString};
@@ -1514,6 +1515,7 @@
     ///
     /// [`fs::metadata`]: ../fs/fn.metadata.html
     ///
+    #[cfg(feature = "untrusted_fs")]
     pub fn metadata(&self) -> io::Result<fs::Metadata> {
         fs::metadata(self)
     }
@@ -1524,6 +1526,7 @@
     ///
     /// [`fs::symlink_metadata`]: ../fs/fn.symlink_metadata.html
     ///
+    #[cfg(feature = "untrusted_fs")]
     pub fn symlink_metadata(&self) -> io::Result<fs::Metadata> {
         fs::symlink_metadata(self)
     }
@@ -1535,6 +1538,7 @@
     ///
     /// [`fs::canonicalize`]: ../fs/fn.canonicalize.html
     ///
+    #[cfg(feature = "untrusted_fs")]
     pub fn canonicalize(&self) -> io::Result<PathBuf> {
         fs::canonicalize(self)
     }
@@ -1545,6 +1549,7 @@
     ///
     /// [`fs::read_link`]: ../fs/fn.read_link.html
     ///
+    #[cfg(feature = "untrusted_fs")]
     pub fn read_link(&self) -> io::Result<PathBuf> {
         fs::read_link(self)
     }
@@ -1557,6 +1562,7 @@
     /// If you cannot access the directory containing the file, e.g. because of a
     /// permission error, this will return `false`.
     ///
+    #[cfg(feature = "untrusted_fs")]
     pub fn exists(&self) -> bool {
         fs::metadata(self).is_ok()
     }
@@ -1569,6 +1575,7 @@
     /// If you cannot access the directory containing the file, e.g. because of a
     /// permission error, this will return `false`.
     ///
+    #[cfg(feature = "untrusted_fs")]
     pub fn is_file(&self) -> bool {
         fs::metadata(self).map(|m| m.is_file()).unwrap_or(false)
     }
@@ -1581,6 +1588,7 @@
     /// If you cannot access the directory containing the file, e.g. because of a
     /// permission error, this will return `false`.
     ///
+    #[cfg(feature = "untrusted_fs")]
     pub fn is_dir(&self) -> bool {
         fs::metadata(self).map(|m| m.is_dir()).unwrap_or(false)
     }
diff --git a/sgx_tstd/src/sgxfs.rs b/sgx_tstd/src/sgxfs.rs
index c8fd3b6..ab14e6e 100644
--- a/sgx_tstd/src/sgxfs.rs
+++ b/sgx_tstd/src/sgxfs.rs
@@ -320,6 +320,7 @@
 ///
 /// On success, the total number of bytes copied is returned.
 ///
+#[cfg(feature = "untrusted_fs")]
 pub fn copy<P: AsRef<Path>, Q: AsRef<Path>>(from: P, to: Q) -> io::Result<u64> {
     fs_imp::copy(from.as_ref(), to.as_ref())
 }
diff --git a/sgx_tstd/src/sys/backtrace/tracing/gcc_s.rs b/sgx_tstd/src/sys/backtrace/tracing/gcc_s.rs
index fb635ad..78eca90 100644
--- a/sgx_tstd/src/sys/backtrace/tracing/gcc_s.rs
+++ b/sgx_tstd/src/sys/backtrace/tracing/gcc_s.rs
@@ -119,6 +119,7 @@
         cx.frames[cx.idx] = Frame {
             symbol_addr: symaddr as *mut u8,
             exact_position: ip as *mut u8,
+            inline_context: 0,
         };
         cx.idx += 1;
     }
diff --git a/sgx_tstd/src/sys/ext/io.rs b/sgx_tstd/src/sys/ext/io.rs
index 6f1e198..f94e51a 100644
--- a/sgx_tstd/src/sys/ext/io.rs
+++ b/sgx_tstd/src/sys/ext/io.rs
@@ -29,6 +29,7 @@
 //! Unix-specific extensions to general I/O primitives
 
 use sgx_trts::libc;
+#[cfg(feature = "untrusted_fs")]
 use fs;
 use os::raw;
 use sys;
@@ -82,18 +83,21 @@
     fn into_raw_fd(self) -> RawFd;
 }
 
+#[cfg(feature = "untrusted_fs")]
 impl AsRawFd for fs::File {
     fn as_raw_fd(&self) -> RawFd {
         self.as_inner().fd().raw()
     }
 }
 
+#[cfg(feature = "untrusted_fs")]
 impl FromRawFd for fs::File {
     unsafe fn from_raw_fd(fd: RawFd) -> fs::File {
         fs::File::from_inner(sys::fs::File::from_inner(fd))
     }
 }
 
+#[cfg(feature = "untrusted_fs")]
 impl IntoRawFd for fs::File {
     fn into_raw_fd(self) -> RawFd {
         self.into_inner().into_fd().into_raw()
diff --git a/sgx_tstd/src/sys/ext/mod.rs b/sgx_tstd/src/sys/ext/mod.rs
index 9f3585b..a820717 100644
--- a/sgx_tstd/src/sys/ext/mod.rs
+++ b/sgx_tstd/src/sys/ext/mod.rs
@@ -28,7 +28,9 @@
 
 pub mod io;
 pub mod ffi;
+#[cfg(feature = "untrusted_fs")]
 pub mod fs;
+#[cfg(feature = "untrusted_net")]
 pub mod net;
 
 /// A prelude for conveniently writing platform-specific code.
@@ -37,6 +39,8 @@
 pub mod prelude {
     pub use super::io::{RawFd, AsRawFd, FromRawFd, IntoRawFd};
     pub use super::ffi::{OsStrExt, OsStringExt};
+    #[cfg(feature = "untrusted_fs")]
     pub use super::fs::{PermissionsExt, OpenOptionsExt, MetadataExt, FileTypeExt};
+    #[cfg(feature = "untrusted_fs")]
     pub use super::fs::FileExt;
 }
diff --git a/sgx_tstd/src/sys/mod.rs b/sgx_tstd/src/sys/mod.rs
index 8904c19..798a149 100644
--- a/sgx_tstd/src/sys/mod.rs
+++ b/sgx_tstd/src/sys/mod.rs
@@ -32,8 +32,10 @@
 pub use self::rand::hashmap_random_keys;
 
 pub mod fd;
+#[cfg(feature = "untrusted_fs")]
 pub mod fs;
 pub mod sgxfs;
+#[cfg(feature = "untrusted_net")]
 pub mod net;
 pub mod os_str;
 pub mod path;
diff --git a/sgx_tstd/src/sys/sgxfs.rs b/sgx_tstd/src/sys/sgxfs.rs
index 5b90911..1b8cc70 100644
--- a/sgx_tstd/src/sys/sgxfs.rs
+++ b/sgx_tstd/src/sys/sgxfs.rs
@@ -299,6 +299,7 @@
     }
 }
 
+#[cfg(feature = "untrusted_fs")]
 pub fn copy(from: &Path, to: &Path) -> io::Result<u64> {
     use sgxfs::SgxFile;
     use fs;
diff --git a/sgx_tstd/src/sys_common/backtrace.rs b/sgx_tstd/src/sys_common/backtrace.rs
index 594d0a5..d26d734 100644
--- a/sgx_tstd/src/sys_common/backtrace.rs
+++ b/sgx_tstd/src/sys_common/backtrace.rs
@@ -59,6 +59,8 @@
     pub exact_position: *const u8,
     /// Address of the enclosing function.
     pub symbol_addr: *const u8,
+    /// Which inlined function is this frame referring to
+    pub inline_context: u32,
 }
 
 /// Max number of frames to print.
@@ -95,6 +97,7 @@
     let mut frames = [Frame {
         exact_position: ptr::null(),
         symbol_addr: ptr::null(),
+        inline_context: 0,
     }; MAX_NB_FRAMES];
     let (nb_frames, context) = unwind_backtrace(&mut frames)?;
     let (skipped_before, skipped_after) =
diff --git a/sgx_tstd/src/sys_common/mod.rs b/sgx_tstd/src/sys_common/mod.rs
index 8d91149..92c7a68 100644
--- a/sgx_tstd/src/sys_common/mod.rs
+++ b/sgx_tstd/src/sys_common/mod.rs
@@ -36,6 +36,7 @@
 pub mod poison;
 pub mod thread_info;
 pub mod wtf8;
+#[cfg(feature = "untrusted_net")]
 pub mod net;
 pub mod bytestring;
 
diff --git a/sgx_tstd/src/time/duration.rs b/sgx_tstd/src/time/duration.rs
index 7a212e6..e57a1ad 100644
--- a/sgx_tstd/src/time/duration.rs
+++ b/sgx_tstd/src/time/duration.rs
@@ -75,35 +75,38 @@
     /// Creates a new `Duration` from the specified number of whole seconds.
     ///
     #[inline]
-    pub fn from_secs(secs: u64) -> Duration {
+    pub const fn from_secs(secs: u64) -> Duration {
         Duration { secs: secs, nanos: 0 }
     }
 
     /// Creates a new `Duration` from the specified number of milliseconds.
     ///
     #[inline]
-    pub fn from_millis(millis: u64) -> Duration {
-        let secs = millis / MILLIS_PER_SEC;
-        let nanos = ((millis % MILLIS_PER_SEC) as u32) * NANOS_PER_MILLI;
-        Duration { secs: secs, nanos: nanos }
+    pub const fn from_millis(millis: u64) -> Duration {
+        Duration {
+            secs: millis / MILLIS_PER_SEC,
+            nanos: ((millis % MILLIS_PER_SEC) as u32) * NANOS_PER_MILLI,
+        }
     }
 
     /// Creates a new `Duration` from the specified number of microseconds.
     ///
     #[inline]
-    pub fn from_micros(micros: u64) -> Duration {
-        let secs = micros / MICROS_PER_SEC;
-        let nanos = ((micros % MICROS_PER_SEC) as u32) * NANOS_PER_MICRO;
-        Duration { secs: secs, nanos: nanos }
+    pub const fn from_micros(micros: u64) -> Duration {
+        Duration {
+            secs: micros / MICROS_PER_SEC,
+            nanos: ((micros % MICROS_PER_SEC) as u32) * NANOS_PER_MICRO,
+        }
     }
 
     /// Creates a new `Duration` from the specified number of nanoseconds.
     ///
     #[inline]
-    pub fn from_nanos(nanos: u64) -> Duration {
-        let secs = nanos / (NANOS_PER_SEC as u64);
-        let nanos = (nanos % (NANOS_PER_SEC as u64)) as u32;
-        Duration { secs: secs, nanos: nanos }
+    pub const fn from_nanos(nanos: u64) -> Duration {
+        Duration {
+            secs: nanos / (NANOS_PER_SEC as u64),
+            nanos: (nanos % (NANOS_PER_SEC as u64)) as u32,
+        }
     }
 
     /// Returns the number of _whole_ seconds contained by this `Duration`.
diff --git a/sgx_tstd/src/time/mod.rs b/sgx_tstd/src/time/mod.rs
index 9ac100f..af3693a 100644
--- a/sgx_tstd/src/time/mod.rs
+++ b/sgx_tstd/src/time/mod.rs
@@ -92,6 +92,7 @@
 impl Instant {
     /// Returns an instant corresponding to "now".
     ///
+    #[cfg(feature = "untrusted_time")]
     pub fn now() -> Instant {
         Instant(time::Instant::now())
     }
@@ -114,6 +115,7 @@
     /// instant, which is something that can happen if an `Instant` is
     /// produced synthetically.
     ///
+    #[cfg(feature = "untrusted_time")]
     pub fn elapsed(&self) -> Duration {
         Instant::now() - *self
     }
@@ -164,6 +166,7 @@
 impl SystemTime {
     /// Returns the system time corresponding to "now".
     ///
+    #[cfg(feature = "untrusted_time")]
     pub fn now() -> SystemTime {
         SystemTime(time::SystemTime::now())
     }
@@ -196,6 +199,7 @@
     /// Returns an [`Err`] if `self` is later than the current system time, and
     /// the error contains how far from the current system time `self` is.
     ///
+    #[cfg(feature = "untrusted_time")]
     pub fn elapsed(&self) -> Result<Duration, SystemTimeError> {
         SystemTime::now().duration_since(*self)
     }
diff --git a/sgx_tunittest/Cargo.toml b/sgx_tunittest/Cargo.toml
index 9b6f366..9a92e88 100644
--- a/sgx_tunittest/Cargo.toml
+++ b/sgx_tunittest/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_tunittest"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_types/Cargo.toml b/sgx_types/Cargo.toml
index ab44872..cc550e1 100644
--- a/sgx_types/Cargo.toml
+++ b/sgx_types/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_types"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/sgx_urts/Cargo.toml b/sgx_urts/Cargo.toml
index 5ebfd6b..75840d7 100644
--- a/sgx_urts/Cargo.toml
+++ b/sgx_urts/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_urts"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/third_party/cfg-if/Xargo.toml b/third_party/cfg-if/Xargo.toml
new file mode 100644
index 0000000..ff44231
--- /dev/null
+++ b/third_party/cfg-if/Xargo.toml
@@ -0,0 +1,25 @@
+[dependencies]
+alloc = {}
+panic_unwind = {}
+panic_abort = {}
+
+[dependencies.compiler_builtins]
+features = ["c", "compiler-builtins"]
+git = "https://github.com/rust-lang-nursery/compiler-builtins"
+stage = 1
+
+[dependencies.std]
+path = "../../xargo/sgx_tstd"
+stage = 2
+
+[dependencies.sgx_rand]
+path = "../../xargo/sgx_rand"
+stage = 3
+
+[dependencies.sgx_serialize]
+path = "../../xargo/sgx_serialize"
+stage = 3
+
+[dependencies.sgx_tunittest]
+path = "../../xargo/sgx_tunittest"
+stage = 3
\ No newline at end of file
diff --git a/third_party/num/integer/Xargo.toml b/third_party/num/integer/Xargo.toml
new file mode 100644
index 0000000..8457060
--- /dev/null
+++ b/third_party/num/integer/Xargo.toml
@@ -0,0 +1,25 @@
+[dependencies]
+alloc = {}
+panic_unwind = {}
+panic_abort = {}
+
+[dependencies.compiler_builtins]
+features = ["c", "compiler-builtins"]
+git = "https://github.com/rust-lang-nursery/compiler-builtins"
+stage = 1
+
+[dependencies.std]
+path = "../../../xargo/sgx_tstd"
+stage = 2
+
+[dependencies.sgx_rand]
+path = "../../../xargo/sgx_rand"
+stage = 3
+
+[dependencies.sgx_serialize]
+path = "../../../xargo/sgx_serialize"
+stage = 3
+
+[dependencies.sgx_tunittest]
+path = "../../../xargo/sgx_tunittest"
+stage = 3
\ No newline at end of file
diff --git a/third_party/num/iter/Xargo.toml b/third_party/num/iter/Xargo.toml
new file mode 100644
index 0000000..8457060
--- /dev/null
+++ b/third_party/num/iter/Xargo.toml
@@ -0,0 +1,25 @@
+[dependencies]
+alloc = {}
+panic_unwind = {}
+panic_abort = {}
+
+[dependencies.compiler_builtins]
+features = ["c", "compiler-builtins"]
+git = "https://github.com/rust-lang-nursery/compiler-builtins"
+stage = 1
+
+[dependencies.std]
+path = "../../../xargo/sgx_tstd"
+stage = 2
+
+[dependencies.sgx_rand]
+path = "../../../xargo/sgx_rand"
+stage = 3
+
+[dependencies.sgx_serialize]
+path = "../../../xargo/sgx_serialize"
+stage = 3
+
+[dependencies.sgx_tunittest]
+path = "../../../xargo/sgx_tunittest"
+stage = 3
\ No newline at end of file
diff --git a/third_party/num/traits/Xargo.toml b/third_party/num/traits/Xargo.toml
new file mode 100644
index 0000000..8457060
--- /dev/null
+++ b/third_party/num/traits/Xargo.toml
@@ -0,0 +1,25 @@
+[dependencies]
+alloc = {}
+panic_unwind = {}
+panic_abort = {}
+
+[dependencies.compiler_builtins]
+features = ["c", "compiler-builtins"]
+git = "https://github.com/rust-lang-nursery/compiler-builtins"
+stage = 1
+
+[dependencies.std]
+path = "../../../xargo/sgx_tstd"
+stage = 2
+
+[dependencies.sgx_rand]
+path = "../../../xargo/sgx_rand"
+stage = 3
+
+[dependencies.sgx_serialize]
+path = "../../../xargo/sgx_serialize"
+stage = 3
+
+[dependencies.sgx_tunittest]
+path = "../../../xargo/sgx_tunittest"
+stage = 3
\ No newline at end of file
diff --git a/third_party/rawpointer/Xargo.toml b/third_party/rawpointer/Xargo.toml
new file mode 100644
index 0000000..ff44231
--- /dev/null
+++ b/third_party/rawpointer/Xargo.toml
@@ -0,0 +1,25 @@
+[dependencies]
+alloc = {}
+panic_unwind = {}
+panic_abort = {}
+
+[dependencies.compiler_builtins]
+features = ["c", "compiler-builtins"]
+git = "https://github.com/rust-lang-nursery/compiler-builtins"
+stage = 1
+
+[dependencies.std]
+path = "../../xargo/sgx_tstd"
+stage = 2
+
+[dependencies.sgx_rand]
+path = "../../xargo/sgx_rand"
+stage = 3
+
+[dependencies.sgx_serialize]
+path = "../../xargo/sgx_serialize"
+stage = 3
+
+[dependencies.sgx_tunittest]
+path = "../../xargo/sgx_tunittest"
+stage = 3
\ No newline at end of file
diff --git a/third_party/rulinalg/Cargo.toml b/third_party/rulinalg/Cargo.toml
index f0194db..76d8480 100644
--- a/third_party/rulinalg/Cargo.toml
+++ b/third_party/rulinalg/Cargo.toml
@@ -15,7 +15,7 @@
 io = ["csv", "rustc-serialize"]
 
 [target.'cfg(not(target_env = "sgx"))'.dependencies]
-sgx_tstd = { path =  "../../sgx_tstd" }
+sgx_tstd = { path =  "../../sgx_tstd", features = ["untrusted_fs"] }
 
 [dependencies]
 num = {path = "../num", default-features = false }
diff --git a/third_party/rulinalg/Xargo.toml b/third_party/rulinalg/Xargo.toml
index ff44231..01d5cb0 100644
--- a/third_party/rulinalg/Xargo.toml
+++ b/third_party/rulinalg/Xargo.toml
@@ -10,6 +10,7 @@
 
 [dependencies.std]
 path = "../../xargo/sgx_tstd"
+features = ["untrusted_fs"]
 stage = 2
 
 [dependencies.sgx_rand]
diff --git a/third_party/rust-csv/.gitignore b/third_party/rust-csv/.gitignore
new file mode 100644
index 0000000..d24edbd
--- /dev/null
+++ b/third_party/rust-csv/.gitignore
@@ -0,0 +1,9 @@
+.*.swp
+doc
+tags
+examples/ss10pusa.csv
+build
+target
+Cargo.lock
+scratch*
+bench_large/huge
diff --git a/third_party/rust-csv/.travis.yml b/third_party/rust-csv/.travis.yml
new file mode 100644
index 0000000..13f9444
--- /dev/null
+++ b/third_party/rust-csv/.travis.yml
@@ -0,0 +1,18 @@
+dist: trusty
+language: rust
+rust:
+  - 1.15.0
+  - stable
+  - beta
+  - nightly
+script:
+  - ./ci/check-copy cookbook
+  - ./ci/check-copy tutorial
+  - cargo build --verbose
+  - cargo test --verbose
+  - cargo test --verbose --manifest-path csv-core/Cargo.toml
+  - cargo test --verbose --manifest-path csv-index/Cargo.toml
+  - cargo doc
+  - if [ "$TRAVIS_RUST_VERSION" = "nightly" ]; then
+      cargo bench --verbose --no-run;
+    fi
diff --git a/third_party/rust-csv/Cargo.toml b/third_party/rust-csv/Cargo.toml
index b7b97fb..17a7b23 100644
--- a/third_party/rust-csv/Cargo.toml
+++ b/third_party/rust-csv/Cargo.toml
@@ -19,7 +19,7 @@
 bench = false
 
 [target.'cfg(not(target_env = "sgx"))'.dependencies]
-sgx_tstd = { path =  "../../sgx_tstd" }
+sgx_tstd = { path =  "../../sgx_tstd", features = ["untrusted_fs"] }
 
 [dependencies]
 csv-core = { path = "csv-core", version = "0.1.3" }
diff --git a/third_party/rust-csv/Xargo.toml b/third_party/rust-csv/Xargo.toml
index ff44231..01d5cb0 100644
--- a/third_party/rust-csv/Xargo.toml
+++ b/third_party/rust-csv/Xargo.toml
@@ -10,6 +10,7 @@
 
 [dependencies.std]
 path = "../../xargo/sgx_tstd"
+features = ["untrusted_fs"]
 stage = 2
 
 [dependencies.sgx_rand]
diff --git a/third_party/rust-csv/csv-core/Xargo.toml b/third_party/rust-csv/csv-core/Xargo.toml
new file mode 100644
index 0000000..8457060
--- /dev/null
+++ b/third_party/rust-csv/csv-core/Xargo.toml
@@ -0,0 +1,25 @@
+[dependencies]
+alloc = {}
+panic_unwind = {}
+panic_abort = {}
+
+[dependencies.compiler_builtins]
+features = ["c", "compiler-builtins"]
+git = "https://github.com/rust-lang-nursery/compiler-builtins"
+stage = 1
+
+[dependencies.std]
+path = "../../../xargo/sgx_tstd"
+stage = 2
+
+[dependencies.sgx_rand]
+path = "../../../xargo/sgx_rand"
+stage = 3
+
+[dependencies.sgx_serialize]
+path = "../../../xargo/sgx_serialize"
+stage = 3
+
+[dependencies.sgx_tunittest]
+path = "../../../xargo/sgx_tunittest"
+stage = 3
\ No newline at end of file
diff --git a/third_party/rust-csv/csv-index/Xargo.toml b/third_party/rust-csv/csv-index/Xargo.toml
new file mode 100644
index 0000000..8457060
--- /dev/null
+++ b/third_party/rust-csv/csv-index/Xargo.toml
@@ -0,0 +1,25 @@
+[dependencies]
+alloc = {}
+panic_unwind = {}
+panic_abort = {}
+
+[dependencies.compiler_builtins]
+features = ["c", "compiler-builtins"]
+git = "https://github.com/rust-lang-nursery/compiler-builtins"
+stage = 1
+
+[dependencies.std]
+path = "../../../xargo/sgx_tstd"
+stage = 2
+
+[dependencies.sgx_rand]
+path = "../../../xargo/sgx_rand"
+stage = 3
+
+[dependencies.sgx_serialize]
+path = "../../../xargo/sgx_serialize"
+stage = 3
+
+[dependencies.sgx_tunittest]
+path = "../../../xargo/sgx_tunittest"
+stage = 3
\ No newline at end of file
diff --git a/third_party/rustls/Cargo.toml b/third_party/rustls/Cargo.toml
index 4ff7e9c..9af0b31 100644
--- a/third_party/rustls/Cargo.toml
+++ b/third_party/rustls/Cargo.toml
@@ -10,7 +10,7 @@
 categories = ["network-programming", "cryptography"]
 
 [target.'cfg(not(target_env = "sgx"))'.dependencies]
-sgx_tstd = { path =  "../../sgx_tstd" }
+sgx_tstd = { path =  "../../sgx_tstd", features = ["untrusted_time"] }
 
 [dependencies]
 untrusted = { version = "0.6", path = "../untrusted" }
diff --git a/third_party/rustls/Xargo.toml b/third_party/rustls/Xargo.toml
index ff44231..ad7f49c 100644
--- a/third_party/rustls/Xargo.toml
+++ b/third_party/rustls/Xargo.toml
@@ -10,6 +10,7 @@
 
 [dependencies.std]
 path = "../../xargo/sgx_tstd"
+features = ["untrusted_time"]
 stage = 2
 
 [dependencies.sgx_rand]
diff --git a/third_party/rusty-machine/Cargo.toml b/third_party/rusty-machine/Cargo.toml
index f741d0f..5c7382d 100644
--- a/third_party/rusty-machine/Cargo.toml
+++ b/third_party/rusty-machine/Cargo.toml
@@ -16,7 +16,7 @@
 datasets = []
 
 [target.'cfg(not(target_env = "sgx"))'.dependencies]
-sgx_tstd = { path =  "../../sgx_tstd" }
+sgx_tstd = { path =  "../../sgx_tstd", features = ["untrusted_fs"] }
 sgx_rand = { path = "../../sgx_rand"}
 
 [dependencies]
diff --git a/third_party/rusty-machine/Xargo.toml b/third_party/rusty-machine/Xargo.toml
index ff44231..01d5cb0 100644
--- a/third_party/rusty-machine/Xargo.toml
+++ b/third_party/rusty-machine/Xargo.toml
@@ -10,6 +10,7 @@
 
 [dependencies.std]
 path = "../../xargo/sgx_tstd"
+features = ["untrusted_fs"]
 stage = 2
 
 [dependencies.sgx_rand]
diff --git a/third_party/untrusted/Xargo.toml b/third_party/untrusted/Xargo.toml
new file mode 100644
index 0000000..ff44231
--- /dev/null
+++ b/third_party/untrusted/Xargo.toml
@@ -0,0 +1,25 @@
+[dependencies]
+alloc = {}
+panic_unwind = {}
+panic_abort = {}
+
+[dependencies.compiler_builtins]
+features = ["c", "compiler-builtins"]
+git = "https://github.com/rust-lang-nursery/compiler-builtins"
+stage = 1
+
+[dependencies.std]
+path = "../../xargo/sgx_tstd"
+stage = 2
+
+[dependencies.sgx_rand]
+path = "../../xargo/sgx_rand"
+stage = 3
+
+[dependencies.sgx_serialize]
+path = "../../xargo/sgx_serialize"
+stage = 3
+
+[dependencies.sgx_tunittest]
+path = "../../xargo/sgx_tunittest"
+stage = 3
\ No newline at end of file
diff --git a/third_party/webpki/Cargo.toml b/third_party/webpki/Cargo.toml
index c1c1dc3..a782235 100644
--- a/third_party/webpki/Cargo.toml
+++ b/third_party/webpki/Cargo.toml
@@ -63,7 +63,7 @@
 std = []
 
 [target.'cfg(not(target_env = "sgx"))'.dependencies]
-sgx_tstd = { path =  "../../sgx_tstd" }
+sgx_tstd = { path =  "../../sgx_tstd", features = ["untrusted_time"] }
 
 [dependencies]
 ring = { path = "../ring" }
diff --git a/third_party/webpki/Xargo.toml b/third_party/webpki/Xargo.toml
index ff44231..ad7f49c 100644
--- a/third_party/webpki/Xargo.toml
+++ b/third_party/webpki/Xargo.toml
@@ -10,6 +10,7 @@
 
 [dependencies.std]
 path = "../../xargo/sgx_tstd"
+features = ["untrusted_time"]
 stage = 2
 
 [dependencies.sgx_rand]
diff --git a/xargo/sgx_rand/Cargo.toml b/xargo/sgx_rand/Cargo.toml
index 502fe7a..b14cdbf 100644
--- a/xargo/sgx_rand/Cargo.toml
+++ b/xargo/sgx_rand/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_rand"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/xargo/sgx_serialize/Cargo.toml b/xargo/sgx_serialize/Cargo.toml
index 165d6f9..e0ea5a2 100644
--- a/xargo/sgx_serialize/Cargo.toml
+++ b/xargo/sgx_serialize/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_serialize"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]
diff --git a/xargo/sgx_tstd/Cargo.toml b/xargo/sgx_tstd/Cargo.toml
index c211e45..84a8a4d 100644
--- a/xargo/sgx_tstd/Cargo.toml
+++ b/xargo/sgx_tstd/Cargo.toml
@@ -10,9 +10,12 @@
 crate-type = ["rlib"]
 
 [features]
-default = ["backtrace"]
+default = ["stdio"]
 backtrace = ["stdio"]
 stdio = []
+untrusted_fs = []
+untrusted_net = []
+untrusted_time = []
 
 [build-dependencies]
 build_helper = { path = "../../build_helper" }
diff --git a/xargo/sgx_tunittest/Cargo.toml b/xargo/sgx_tunittest/Cargo.toml
index aa19cab..8de1cd7 100644
--- a/xargo/sgx_tunittest/Cargo.toml
+++ b/xargo/sgx_tunittest/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "sgx_tunittest"
-version = "0.9.5"
+version = "0.9.6"
 authors = ["Baidu"]
 
 [lib]