Use powerful functions in "My First Function"
diff --git a/docs/my-first-function.md b/docs/my-first-function.md
index 8cb6433..ca780ec 100644
--- a/docs/my-first-function.md
+++ b/docs/my-first-function.md
@@ -72,12 +72,12 @@
 ```
 $ cd incubator-teaclave
 $ docker run --rm -v $(pwd):/teaclave -w /teaclave \
-  -it teaclave/teaclave-build-ubuntu-1804-sgx-2.14:latest \
+  -it teaclave/teaclave-build-ubuntu-1804-sgx-2.17.1:0.2.0 \
    bash -c ". /root/.cargo/env && \
      . /opt/sgxsdk/environment && \
      mkdir -p build && cd build && \
      cmake -DTEST_MODE=ON .. && \
-     make"
+     make -j"
 ```
 
 ## Setup Attestation Service
@@ -130,63 +130,86 @@
 
 ## Invoke Function
 
-We provide several examples to demonstrate the platform. Let's get started
-with invoking a built-in function: echo, which is a simple function that takes one
-input message and returns it.
+We provide several examples to demonstrate the platform. Let's get started with
+invoking a built-in function: ordered-set-intersect, which is a function that
+takes two ordered sets and returns the intersection set in the output files.
+This function is a kind of
+[PSI](https://en.wikipedia.org/wiki/Private_set_intersection) implementation
+based on TEE.
 
 This example is written in Python, and some dependencies are needed for the
 remote attestation. They can be installed with `pip`:
 
 ```
-$ pip3 install pyopenssl toml cryptography
+$ pip3 install pyopenssl toml cryptography grpcio grpcio-tools grpclib
 ```
 
 ### Built-in function
 
-Then, run the echo example:
+Then, run the PSI example:
 
 ```
 $ cd examples/python
-$ PYTHONPATH=../../sdk/python python3 builtin_echo.py 'Hello, Teaclave!'
-[+] registering user
-[+] login
-[+] registering function
-[+] creating task
-[+] approving task
-[+] invoking task
-[+] getting result
-[+] done
-[+] function return:  b'Hello, Teaclave!'
+$ PYTHONPATH=../../sdk/python python3 builtin_ordered_set_intersect.py 
+[+] user0 login
+[+] user1 login
+[+] user0 registering function
+[+] user0 creating task
+[+] user0 registering input file
+[+] user0 registering output file
+[+] user0 assigning data to task
+[+] user1 registering input file
+[+] user1 registering output file
+[+] user1 assigning data to task
+[+] user0 approving task
+[+] user1 approving task
+[+] user0 invoking task
+[+] user0 getting task result
+[+] user1 getting task result
+[+] User 0 result: 3 common items
+[+] User 1 result: 3 common items
 ```
 
-If you see above log, this means that the function is successfully invoked in Teaclave.
+If you see above log, this means that the function is successfully invoked in
+Teaclave. The intersection set is stored in the output files that the users registered.
 
 ### Define my own function
 
-The previous example is to demonstrate invoking the built-in echo function. In
-Teaclave, you can also register and invoke a function written by yourself.
-For example, we can implement an echo function in Python like this:
+The previous example is to demonstrate invoking the built-in PSI function. In
+Teaclave, you can also register and invoke a function written by yourself. For
+example, we have implemented a [logistic
+regression](https://en.wikipedia.org/wiki/Logistic_regression) function in
+Python in
+[mesapy_logistic_reg_payload.py](../examples/python/mesapy_logistic_reg_payload.py).
+It can conduct both training and prediction.
 
+Then run the mesapy LR example:
 ```
-$ cat mesapy_echo_payload.py
-def entrypoint(argv):
-    assert argv[0] == 'message'
-    assert argv[1] is not None
-    return argv[1]
-```
-
-Then run the mesapy echo example:
-```
-$ PYTHONPATH=../../sdk/python python3 mesapy_echo.py mesapy_echo_payload.py 'Hello, Teaclave!'
-[+] registering user
-[+] login
-[+] registering function
-[+] creating task
-[+] approving task
-[+] invoking task
-[+] getting result
-[+] done
-[+] function return:  b'Hello, Teaclave!'
+$ PYTHONPATH=../../sdk/python python3 mesapy_logistic_reg.py
+[+] mesapy_logistic_reg_train_task begin!
+[+] admin login
+[+] admin registering function
+[+] admin reading payload file
+[+] admin creating task
+[+] admin registering input file
+[+] admin registering output file
+[+] admin assigning data to task
+[+] admin invoking task
+[+] admin getting task result
+[+] User 0 result: Training is finished!
+[+] mesapy_logistic_reg_predict_task begin!
+[+] admin registering function
+[+] admin reading payload file
+[+] admin creating task
+[+] admin getting task output
+[+] admin getting task output
+[+] admin registering input file
+[+] admin registering output file
+[+] admin assigning data to task
+[+] admin invoking task
+[+] admin getting task result
+[+] Predict result: [1.0 1.0 0.0 0.0 0.0]
+[+] logistic_reg_task end!
 ```
 
 ## Simulation Mode
@@ -201,12 +224,12 @@
 $ git clone https://github.com/apache/incubator-teaclave.git
 $ cd incubator-teaclave
 $ docker run --rm -v $(pwd):/teaclave -w /teaclave \
-  -it teaclave/teaclave-build-ubuntu-1804-sgx-2.14:latest \
+  -it teaclave/teaclave-build-ubuntu-1804-sgx-2.17.1:0.2.0 \
    bash -c ". /root/.cargo/env && \
      . /opt/sgxsdk/environment && \
      mkdir -p build && cd build && \
      cmake -DTEST_MODE=ON -DSGX_SIM_MODE=ON .. && \
-     make"
+     make -j"
 ```
 
 Since the attestation is disabled in the simulation mode, related environment
@@ -225,13 +248,7 @@
 $ (cd docker && ./run-teaclave-services.sh -m sim)
 ```
 
-Install dependencies for Python client.
-
-```
-$ pip3 install pyopenssl toml cryptography
-```
-
-In simulation mode, run examples with `SGX_MODE=SW` environment variable.
+In simulation mode, run the echo example with `SGX_MODE=SW` environment variable.
 
 ```
 $ cd examples/python