Preparing for 0.4.0 release
diff --git a/LICENSE-binary b/LICENSE-binary
index 20158ee..79fa2bb 100644
--- a/LICENSE-binary
+++ b/LICENSE-binary
@@ -271,7 +271,7 @@
 org.apache.htrace:htrace-core4:4.1.0-incubating
 org.apache.httpcomponents:httpclient:4.5.2
 org.apache.httpcomponents:httpcore:4.4.4
-org.apache.submarine:submarine-core:0.4.0-SNAPSHOT
+org.apache.submarine:submarine-core:0.4.0
 org.apache.zookeeper:zookeeper:3.4.6
 org.codehaus.jackson:jackson-core-asl:1.9.13
 org.codehaus.jackson:jackson-mapper-asl:1.9.13
diff --git a/dev-support/docker-images/database/build.sh b/dev-support/docker-images/database/build.sh
index 218fe00..a0dba16 100755
--- a/dev-support/docker-images/database/build.sh
+++ b/dev-support/docker-images/database/build.sh
@@ -25,7 +25,7 @@
 export CURRENT_PATH=$(cd "${PWD}">/dev/null; pwd)
 SUBMARINE_HOME=${CURRENT_PATH}/../../..
 
-SUBMARINE_VERSION="0.4.0-SNAPSHOT"
+SUBMARINE_VERSION="0.4.0"
 SUBMARINE_IMAGE_NAME="apache/submarine:database-${SUBMARINE_VERSION}"
 
 cp -rf "${SUBMARINE_HOME}/docs/database" "${CURRENT_PATH}"
diff --git a/dev-support/docker-images/operator/build.sh b/dev-support/docker-images/operator/build.sh
index 3a26703..824c6ae 100755
--- a/dev-support/docker-images/operator/build.sh
+++ b/dev-support/docker-images/operator/build.sh
@@ -17,7 +17,7 @@
 set -eo pipefail
 set -x
 
-SUBMARINE_VERSION=0.4.0-SNAPSHOT
+SUBMARINE_VERSION=0.4.0
 SUBMARINE_IMAGE_NAME="apache/submarine:operator-${SUBMARINE_VERSION}"
 
 if [ -L ${BASH_SOURCE-$0} ]; then
diff --git a/dev-support/docker-images/submarine/build.sh b/dev-support/docker-images/submarine/build.sh
index aa6625b..2775194 100755
--- a/dev-support/docker-images/submarine/build.sh
+++ b/dev-support/docker-images/submarine/build.sh
@@ -17,7 +17,7 @@
 set -eo pipefail
 set -x
 
-SUBMARINE_VERSION=0.4.0-SNAPSHOT
+SUBMARINE_VERSION=0.4.0
 SUBMARINE_IMAGE_NAME="apache/submarine:server-${SUBMARINE_VERSION}"
 
 if [ -L ${BASH_SOURCE-$0} ]; then
diff --git a/dev-support/mini-submarine/README.md b/dev-support/mini-submarine/README.md
index 564e6f1..5783400 100644
--- a/dev-support/mini-submarine/README.md
+++ b/dev-support/mini-submarine/README.md
@@ -23,7 +23,7 @@
 ### Use the image we provide
 
 ```
-docker pull apache/submarine:mini-0.3.0
+docker pull apache/submarine:mini-0.4.0
 ```
 
 ### Create image by yourself
@@ -57,24 +57,24 @@
 Put submarine candidate aritifacts to a folder like "~/releases/submarine-release"
 ```
 $ ls $release_candidates_path
-submarine-dist-0.3.0-hadoop-2.9.tar.gz        submarine-dist-0.3.0-src.tar.gz.asc
-submarine-dist-0.3.0-hadoop-2.9.tar.gz.asc    submarine-dist-0.3.0-src.tar.gz.sha512
-submarine-dist-0.3.0-hadoop-2.9.tar.gz.sha512 submarine-dist-0.3.0-src.tar.gz
+submarine-dist-0.4.0-hadoop-2.9.tar.gz        submarine-dist-0.4.0-src.tar.gz.asc
+submarine-dist-0.4.0-hadoop-2.9.tar.gz.asc    submarine-dist-0.4.0-src.tar.gz.sha512
+submarine-dist-0.4.0-hadoop-2.9.tar.gz.sha512 submarine-dist-0.4.0-src.tar.gz
 ```
 ```
-export submarine_version=0.3.0
-export release_candidates_path=~/releases/submarine-release 
+export submarine_version=0.4.0
+export release_candidates_path=~/releases/submarine-release
 ./build_mini-submarine.sh
-#docker run -it -h submarine-dev --net=bridge --privileged -P local/mini-submarine:0.3.0 /bin/bash
-docker tag local/mini-submarine:0.3.0 apache/mini-submarine:0.3.0:RC0
-docker push apache/mini-submarine:0.3.0:RC0
+#docker run -it -h submarine-dev --net=bridge --privileged -P local/mini-submarine:0.4.0 /bin/bash
+docker tag local/mini-submarine:0.4.0 apache/mini-submarine:0.4.0:RC0
+docker push apache/mini-submarine:0.4.0:RC0
 ```
-In the container, we can verify that the submarine jar version is the expected 0.3.0. Then we can upload this image with a "RC" tag for a vote.
+In the container, we can verify that the submarine jar version is the expected 0.4.0. Then we can upload this image with a "RC" tag for a vote.
 
 ### Run mini-submarine image
 
 ```
-docker run -it -h submarine-dev --name mini-submarine --net=bridge --privileged -P local/mini-submarine:0.4.0-SNAPSHOT /bin/bash
+docker run -it -h submarine-dev --name mini-submarine --net=bridge --privileged -P local/mini-submarine:0.4.0 /bin/bash
 
 # In the container, use root user to bootstrap hdfs and yarn
 /tmp/hadoop-config/bootstrap.sh
@@ -83,7 +83,7 @@
 yarn node -list -showDetails
 ```
 
-If you pull the image directly, please replace "local/mini-submarine:0.4.0-SNAPSHOT" with "apache/submarine:mini-0.3.0".
+If you pull the image directly, please replace "local/mini-submarine:0.4.0" with "apache/submarine:mini-0.4.0".
 
 ### You should see info like this:
 
@@ -112,7 +112,7 @@
 
 ```
 /tmp/hadoop-config/setup-mysql.sh
-``` 
+```
 
 You can execute command `mysql -uroot` login mysql mariadb.
 
@@ -120,7 +120,7 @@
 ```
 su yarn
 /opt/submarine-current/bin/submarine-daemon.sh start getMysqlJar
-``` 
+```
 
 3. Login submarine workbench
 
@@ -146,7 +146,7 @@
 
 ### Run a mnist TF job with submarine + TonY runtime
 ```
-# run TF 1 distributed training job 
+# run TF 1 distributed training job
 ./run_submarine_mnist_tony.sh
 
 # run TF 2 distributed training job
@@ -233,7 +233,7 @@
 Run the following command to start mini-submarine.
 
 ```
-docker run -it -P -h submarine-dev --net=bridge --expose=8000 --privileged local/mini-submarine:0.4.0-SNAPSHOT /bin/bash
+docker run -it -P -h submarine-dev --net=bridge --expose=8000 --privileged local/mini-submarine:0.4.0 /bin/bash
 ```
 
 Debug submarine client with the parameter "--debug"
@@ -262,7 +262,7 @@
 Run the following command to start mini-submarine.
 
 ```
-docker run -it -P -h submarine-dev --net=bridge --expose=8001 --privileged local/mini-submarine:0.4.0-SNAPSHOT /bin/bash
+docker run -it -P -h submarine-dev --net=bridge --expose=8001 --privileged local/mini-submarine:0.4.0 /bin/bash
 ```
 
 Add the following configuration in the file /usr/local/hadoop/etc/hadoop/tony.xml.
@@ -282,7 +282,7 @@
 Run the following command to start mini-submarine.
 
 ```
-docker run -it -P -h submarine-dev --net=bridge --expose=8002 --privileged local/mini-submarine:0.4.0-SNAPSHOT /bin/bash
+docker run -it -P -h submarine-dev --net=bridge --expose=8002 --privileged local/mini-submarine:0.4.0 /bin/bash
 ```
 
 Add the following configuration in the file /usr/local/hadoop/etc/hadoop/tony.xml.
diff --git a/dev-support/mini-submarine/build_mini-submarine.sh b/dev-support/mini-submarine/build_mini-submarine.sh
index 0a7c8e1..c0d60c9 100755
--- a/dev-support/mini-submarine/build_mini-submarine.sh
+++ b/dev-support/mini-submarine/build_mini-submarine.sh
@@ -17,7 +17,7 @@
 hadoop_v=2.9.2
 spark_v=2.3.4
 
-submarine_v=${submarine_version:-"0.4.0-SNAPSHOT"}
+submarine_v=${submarine_version:-"0.4.0"}
 echo "Using submarine version: $submarine_v"
 
 image_name="local/mini-submarine:${submarine_v}"
diff --git a/dev-support/mini-submarine/submarine/run_customized_submarine-all_mnist.sh b/dev-support/mini-submarine/submarine/run_customized_submarine-all_mnist.sh
index 4adc779..33f2c9b 100755
--- a/dev-support/mini-submarine/submarine/run_customized_submarine-all_mnist.sh
+++ b/dev-support/mini-submarine/submarine/run_customized_submarine-all_mnist.sh
@@ -49,7 +49,7 @@
   WORKER_CMD="myvenv.zip/venv/bin/python mnist_distributed.py --steps 2 --data_dir /tmp/data --working_dir /tmp/mode"
 fi
 
-SUBMARINE_VERSION=${SUBMARINE_VER:-"0.4.0-SNAPSHOT"}
+SUBMARINE_VERSION=${SUBMARINE_VER:-"0.4.0"}
 
 HADOOP_VERSION=2.9
 
diff --git a/dev-support/mini-submarine/submarine/run_submarine_mnist_tf2_tony.sh b/dev-support/mini-submarine/submarine/run_submarine_mnist_tf2_tony.sh
index 2f63c66..40a7298 100755
--- a/dev-support/mini-submarine/submarine/run_submarine_mnist_tf2_tony.sh
+++ b/dev-support/mini-submarine/submarine/run_submarine_mnist_tf2_tony.sh
@@ -39,7 +39,7 @@
   JAVA_CMD="java"
 fi
 
-SUBMARINE_VERSION=0.4.0-SNAPSHOT
+SUBMARINE_VERSION=0.4.0
 HADOOP_VERSION=2.9
 SUBMARINE_PATH=/opt/submarine-current
 HADOOP_CONF_PATH=/usr/local/hadoop/etc/hadoop
diff --git a/dev-support/mini-submarine/submarine/run_submarine_mnist_tony.sh b/dev-support/mini-submarine/submarine/run_submarine_mnist_tony.sh
index d998c33..cf387b6 100755
--- a/dev-support/mini-submarine/submarine/run_submarine_mnist_tony.sh
+++ b/dev-support/mini-submarine/submarine/run_submarine_mnist_tony.sh
@@ -17,7 +17,7 @@
 
 # Below are configurable variables, please adapt base on your local environment.
 # Version of submarine jar
-SUBMARINE_VERSION=${SUBMARINE_VER:-"0.4.0-SNAPSHOT"}
+SUBMARINE_VERSION=${SUBMARINE_VER:-"0.4.0"}
 
 # Version of affiliated Hadoop version for this Submarine jar.
 SUBMARINE_HADOOP_VERSION=2.9
diff --git a/dev-support/mini-submarine/submarine/run_submarine_mnist_tony_rpc.sh b/dev-support/mini-submarine/submarine/run_submarine_mnist_tony_rpc.sh
index 0312a3f..376a331 100644
--- a/dev-support/mini-submarine/submarine/run_submarine_mnist_tony_rpc.sh
+++ b/dev-support/mini-submarine/submarine/run_submarine_mnist_tony_rpc.sh
@@ -45,9 +45,9 @@
   WORKER_CMD="myvenv.zip/venv/bin/python mnist_distributed.py --steps 2 --data_dir /tmp/data --working_dir /tmp/mode --mnist_data_url ${DATA_URL}"
 else
   WORKER_CMD="myvenv.zip/venv/bin/python mnist_distributed.py --steps 2 --data_dir /tmp/data --working_dir /tmp/mode"
-fi 
+fi
 
-SUBMARINE_VERSION=${SUBMARINE_VER:-"0.4.0-SNAPSHOT"}
+SUBMARINE_VERSION=${SUBMARINE_VER:-"0.4.0"}
 
 HADOOP_VERSION=2.9
 
diff --git a/dev-support/mini-submarine/submarine/run_submarine_mxnet_cifar10_tony.sh b/dev-support/mini-submarine/submarine/run_submarine_mxnet_cifar10_tony.sh
index ba5eedb..73d991d 100755
--- a/dev-support/mini-submarine/submarine/run_submarine_mxnet_cifar10_tony.sh
+++ b/dev-support/mini-submarine/submarine/run_submarine_mxnet_cifar10_tony.sh
@@ -39,7 +39,7 @@
   JAVA_CMD="java"
 fi
 
-SUBMARINE_VERSION=0.4.0-SNAPSHOT
+SUBMARINE_VERSION=0.4.0
 HADOOP_VERSION=2.9
 SUBMARINE_PATH=/opt/submarine-current
 HADOOP_CONF_PATH=/usr/local/hadoop/etc/hadoop
diff --git a/dev-support/mini-submarine/submarine/run_submarine_pytorch_mnist_tony.sh b/dev-support/mini-submarine/submarine/run_submarine_pytorch_mnist_tony.sh
index 41ff850..4feec55 100755
--- a/dev-support/mini-submarine/submarine/run_submarine_pytorch_mnist_tony.sh
+++ b/dev-support/mini-submarine/submarine/run_submarine_pytorch_mnist_tony.sh
@@ -39,7 +39,7 @@
   JAVA_CMD="java"
 fi
 
-SUBMARINE_VERSION=0.4.0-SNAPSHOT
+SUBMARINE_VERSION=0.4.0
 HADOOP_VERSION=2.9
 SUBMARINE_PATH=/opt/submarine-current
 HADOOP_CONF_PATH=/usr/local/hadoop/etc/hadoop
diff --git a/dev-support/pysubmarine/openapi.json b/dev-support/pysubmarine/openapi.json
index 3e1521a..f583159 100644
--- a/dev-support/pysubmarine/openapi.json
+++ b/dev-support/pysubmarine/openapi.json
@@ -11,7 +11,7 @@
       "name" : "Apache 2.0",
       "url" : "http://www.apache.org/licenses/LICENSE-2.0.html"
     },
-    "version" : "0.4.0-SNAPSHOT"
+    "version" : "0.4.0"
   },
   "servers" : [ {
     "url" : "/api"
diff --git a/dev-support/pysubmarine/swagger_config.json b/dev-support/pysubmarine/swagger_config.json
index be5877c..38d9b16 100644
--- a/dev-support/pysubmarine/swagger_config.json
+++ b/dev-support/pysubmarine/swagger_config.json
@@ -1,5 +1,5 @@
 {
   "packageName" : "submarine.experiment",
   "projectName" : "submarine.experiment",
-  "packageVersion": "0.4.0-SNAPSHOT"
+  "packageVersion": "0.4.0"
 }
diff --git a/docs/userdocs/yarn/YARNRuntimeGuide.md b/docs/userdocs/yarn/YARNRuntimeGuide.md
index fafd545..2b00988 100644
--- a/docs/userdocs/yarn/YARNRuntimeGuide.md
+++ b/docs/userdocs/yarn/YARNRuntimeGuide.md
@@ -60,7 +60,7 @@
 
 
 ```
-SUBMARINE_VERSION=0.4.0-SNAPSHOT
+SUBMARINE_VERSION=0.4.0
 SUBMARINE_HADOOP_VERSION=3.1
 CLASSPATH=$(hadoop classpath --glob):path-to/submarine-all-${SUBMARINE_VERSION}-hadoop-${SUBMARINE_HADOOP_VERSION}.jar \
 java org.apache.submarine.client.cli.Cli job run --name tf-job-001 \
@@ -94,7 +94,7 @@
 ### With Docker
 
 ```
-SUBMARINE_VERSION=0.4.0-SNAPSHOT
+SUBMARINE_VERSION=0.4.0
 SUBMARINE_HADOOP_VERSION=3.1
 CLASSPATH=$(hadoop classpath --glob):path-to/submarine-all-${SUBMARINE_VERSION}-hadoop-${SUBMARINE_HADOOP_VERSION}.jar \
 java org.apache.submarine.client.cli.Cli job run --name tf-job-001 \
@@ -155,7 +155,7 @@
 
 
 ```
-SUBMARINE_VERSION=0.4.0-SNAPSHOT
+SUBMARINE_VERSION=0.4.0
 SUBMARINE_HADOOP_VERSION=3.1
 CLASSPATH=$(hadoop classpath --glob):path-to/submarine-all-${SUBMARINE_VERSION}-hadoop-${SUBMARINE_HADOOP_VERSION}.jar \
 java org.apache.submarine.client.cli.Cli job run --name PyTorch-job-001 \
@@ -188,7 +188,7 @@
 ### With Docker
 
 ```
-SUBMARINE_VERSION=0.4.0-SNAPSHOT
+SUBMARINE_VERSION=0.4.0
 SUBMARINE_HADOOP_VERSION=3.1
 CLASSPATH=$(hadoop classpath --glob):path-to/submarine-all-${SUBMARINE_VERSION}-hadoop-${SUBMARINE_HADOOP_VERSION}.jar \
 java org.apache.submarine.client.cli.Cli job run --name PyTorch-job-001 \
@@ -240,7 +240,7 @@
 
 
 ```
-SUBMARINE_VERSION=0.4.0-SNAPSHOT
+SUBMARINE_VERSION=0.4.0
 SUBMARINE_HADOOP_VERSION=3.1
 CLASSPATH=$(hadoop classpath --glob):path-to/submarine-all-${SUBMARINE_VERSION}-hadoop-${SUBMARINE_HADOOP_VERSION}.jar \
 java org.apache.submarine.client.cli.Cli job run --name MXNet-job-001 \
@@ -282,7 +282,7 @@
 ### With Docker
 You could refer to this [sample Dockerfile](project/github/submarine/docs/userdocs/yarn/docker/mxnet/cifar10/Dockerfile.cifar10.mx_1.5.1) for building your own Docker image.
 ```
-SUBMARINE_VERSION=0.4.0-SNAPSHOT
+SUBMARINE_VERSION=0.4.0
 SUBMARINE_HADOOP_VERSION=3.1
 CLASSPATH=$(hadoop classpath --glob):path-to/submarine-all-${SUBMARINE_VERSION}-hadoop-${SUBMARINE_HADOOP_VERSION}.jar \
 java org.apache.submarine.client.cli.Cli job run --name MXNet-job-001 \
diff --git a/docs/workbench/HowToRun.md b/docs/workbench/HowToRun.md
index ccc2cab..f2b417e 100644
--- a/docs/workbench/HowToRun.md
+++ b/docs/workbench/HowToRun.md
@@ -28,16 +28,16 @@
 ### Launch the Submarine Workbench(Angular)
 * It should be noted that since Submarine Workbench depends on the Submarine database, so you need to run the docker container of the Submarine database first.
 ```
-docker run -it -p 3306:3306 -d --name submarine-database -e MYSQL_ROOT_PASSWORD=password apache/submarine:database-0.3.0-SNAPSHOT
-docker run -it -p 8080:8080 -d --link=submarine-database:submarine-database --name submarine-server apache/submarine:server-0.3.0-SNAPSHOT
+docker run -it -p 3306:3306 -d --name submarine-database -e MYSQL_ROOT_PASSWORD=password apache/submarine:database-0.4.0
+docker run -it -p 8080:8080 -d --link=submarine-database:submarine-database --name submarine-server apache/submarine:server-0.4.0
 ```
 * The login page of Submarine Workbench will be shown in ```http://127.0.0.1:8080```.
 
 ### Switch from version Angular to version Vue
 *  Step1: Launch submarine-database and submarine-server containers
 ```
-docker run -it -p 3306:3306 -d --name submarine-database -e MYSQL_ROOT_PASSWORD=password apache/submarine:database-0.3.0-SNAPSHOT
-docker run -it -p 8080:8080 -d --link=submarine-database:submarine-database --name submarine-server apache/submarine:server-0.3.0-SNAPSHOT
+docker run -it -p 3306:3306 -d --name submarine-database -e MYSQL_ROOT_PASSWORD=password apache/submarine:database-0.4.0
+docker run -it -p 8080:8080 -d --link=submarine-database:submarine-database --name submarine-server apache/submarine:server-0.4.0
 ```
 *  Step2: Compile Submarine in your host (not in the container)
 ```
@@ -47,7 +47,7 @@
 *  Step3: Copy workbench-web.war into the submarine-server container
 ```
 cd submarine-workbench/workbench-web/target
-docker cp workbench-web.war submarine-server:/opt/submarine-dist-0.3.0-SNAPSHOT-hadoop-2.9
+docker cp workbench-web.war submarine-server:/opt/submarine-dist-0.4.0-hadoop-2.9
 ```
 *  Step4: Enter the submarine-server container
 ```
diff --git a/helm-charts/submarine/Chart.yaml b/helm-charts/submarine/Chart.yaml
index 46e4730..784cee2 100644
--- a/helm-charts/submarine/Chart.yaml
+++ b/helm-charts/submarine/Chart.yaml
@@ -16,7 +16,7 @@
 #
 
 apiVersion: v2
-appVersion: "0.4.0-SNAPSHOT"
+appVersion: "0.4.0"
 description: Submarine is Cloud Native Machine Learning Platform.
 name: submarine
 version: 0.4.0
diff --git a/helm-charts/submarine/values.yaml b/helm-charts/submarine/values.yaml
index edb2202..c46e004 100644
--- a/helm-charts/submarine/values.yaml
+++ b/helm-charts/submarine/values.yaml
@@ -20,13 +20,13 @@
     imagePullPolicy: IfNotPresent
     replicas: 1
     name: submarine-server
-    image: apache/submarine:server-0.4.0-SNAPSHOT
+    image: apache/submarine:server-0.4.0
     servicePort: 8080
   database:
     imagePullPolicy: IfNotPresent
     replicas: 1
     name: submarine-database
-    image: apache/submarine:database-0.4.0-SNAPSHOT
+    image: apache/submarine:database-0.4.0
     servicePort: 3306
     mysqlRootPassword: password
 
diff --git a/pom.xml b/pom.xml
index 2b4b3fb..8262207 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,7 @@
 
   <groupId>org.apache.submarine</groupId>
   <artifactId>submarine</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <packaging>pom</packaging>
   <name>Submarine</name>
   <description>Submarine project</description>
diff --git a/submarine-all/pom.xml b/submarine-all/pom.xml
index cf0b9bd..511e6b7 100644
--- a/submarine-all/pom.xml
+++ b/submarine-all/pom.xml
@@ -25,11 +25,11 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>..</relativePath>
   </parent>
   <artifactId>submarine-all</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: All</name>
 
   <dependencyManagement>
diff --git a/submarine-client/pom.xml b/submarine-client/pom.xml
index b34c317..3a62e25 100644
--- a/submarine-client/pom.xml
+++ b/submarine-client/pom.xml
@@ -24,12 +24,12 @@
   <parent>
     <artifactId>submarine</artifactId>
     <groupId>org.apache.submarine</groupId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
   <artifactId>submarine-client</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Client</name>
 
   <dependencies>
diff --git a/submarine-cloud/Makefile b/submarine-cloud/Makefile
index 61f7697..6aeb6b3 100644
--- a/submarine-cloud/Makefile
+++ b/submarine-cloud/Makefile
@@ -20,7 +20,7 @@
 GOTEST=$(GOCMD) test
 GOGET=$(GOCMD) get
 BINARY_NAME=submarine-operator
-VERSION="0.4.0-SNAPSHOT"
+VERSION="0.4.0"
 BuildGitBranch=$(git rev-parse --abbrev-ref HEAD)
 BuildGitRev=$(git rev-list --count HEAD)
 BuildGitCommit=$(git rev-parse HEAD)
diff --git a/submarine-cloud/hack/deploy-submarine.sh b/submarine-cloud/hack/deploy-submarine.sh
index edb59d3..ff2abe4 100755
--- a/submarine-cloud/hack/deploy-submarine.sh
+++ b/submarine-cloud/hack/deploy-submarine.sh
@@ -20,7 +20,7 @@
 ROOT=$(unset CDPATH && cd $(dirname "${BASH_SOURCE[0]}")/.. && pwd)
 cd $ROOT
 SUBMARINE_HOME=${ROOT}/..
-SUBMARINE_VERSION="0.4.0-SNAPSHOT"
+SUBMARINE_VERSION="0.4.0"
 TF_JUPYTER_IMAGE="apache/submarine:tf2.1.0-jupyter";
 
 source $ROOT/hack/lib.sh
diff --git a/submarine-cloud/manifests/submarine-cluster/submarine-database.yaml b/submarine-cloud/manifests/submarine-cluster/submarine-database.yaml
index b11e609..f0f18cb 100644
--- a/submarine-cloud/manifests/submarine-cluster/submarine-database.yaml
+++ b/submarine-cloud/manifests/submarine-cluster/submarine-database.yaml
@@ -30,7 +30,7 @@
     spec:
       containers:
         - name: submarine-database
-          image: apache/submarine:database-0.4.0-SNAPSHOT
+          image: apache/submarine:database-0.4.0
           ports:
             - containerPort: 3306
           env:
diff --git a/submarine-cloud/manifests/submarine-cluster/submarine-server.yaml b/submarine-cloud/manifests/submarine-cluster/submarine-server.yaml
index 5d7f9a3..dc566a3 100644
--- a/submarine-cloud/manifests/submarine-cluster/submarine-server.yaml
+++ b/submarine-cloud/manifests/submarine-cluster/submarine-server.yaml
@@ -31,7 +31,7 @@
       serviceAccountName: "submarine-node"
       containers:
         - name: submarine-node
-          image: "apache/submarine:server-0.4.0-SNAPSHOT"
+          image: "apache/submarine:server-0.4.0"
           args: []
           imagePullPolicy: IfNotPresent
           ports:
diff --git a/submarine-cloud/manifests/submarine-operator/deployment.yaml b/submarine-cloud/manifests/submarine-operator/deployment.yaml
index 6153c43..d2c6f90 100644
--- a/submarine-cloud/manifests/submarine-operator/deployment.yaml
+++ b/submarine-cloud/manifests/submarine-operator/deployment.yaml
@@ -31,7 +31,7 @@
       serviceAccountName: "submarine-operator"
       containers:
         - name: op
-          image: "apache/submarine:operator-0.4.0-SNAPSHOT"
+          image: "apache/submarine:operator-0.4.0"
           imagePullPolicy: IfNotPresent
           args: ["--v=7", "--logtostderr=true", "--alsologtostderr"]
           resources:
diff --git a/submarine-cloud/pom.xml b/submarine-cloud/pom.xml
index 5fe3341..f6a84c2 100644
--- a/submarine-cloud/pom.xml
+++ b/submarine-cloud/pom.xml
@@ -25,10 +25,10 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
   </parent>
   <artifactId>submarine-cloud</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Cloud</name>
   <packaging>pom</packaging>
 
diff --git a/submarine-cloud/submarine-operator.md b/submarine-cloud/submarine-operator.md
index e395ce1..63815b5 100644
--- a/submarine-cloud/submarine-operator.md
+++ b/submarine-cloud/submarine-operator.md
@@ -127,7 +127,7 @@
 ### Startup controller
 ```
 [root@localhost samplecontroller]# ./samplecontroller
-// This is a simple custom k8s controller, 
+// This is a simple custom k8s controller,
 // used to demonstrate the idea of k8s final state operation and maintenance,
 // https://github.com/gfandada/samplecontroller,
 
@@ -144,7 +144,7 @@
   -t, --toggle          Help message for toggle
 
 Use "samplecontroller [command] --help" for more information about a command.
-[root@localhost samplecontroller]# ./samplecontroller run config=/root/.kube/config 
+[root@localhost samplecontroller]# ./samplecontroller run config=/root/.kube/config
 ERROR: logging before flag.Parse: I0415 15:02:28.619121  109337 samplecontroller.go:59] Create event broadcaster
 ERROR: logging before flag.Parse: I0415 15:02:28.619246  109337 samplecontroller.go:76] Listen for student's add / update / delete events
 ERROR: logging before flag.Parse: I0415 15:02:28.619264  109337 samplecontroller.go:102] Start the controller business and start a cache data synchronization
@@ -165,6 +165,6 @@
 
 ```
 kind load docker-image --name=submarine busybox:1.28.4
-kind load docker-image --name=submarine apache/submarine:server-0.3.0-SNAPSHOT
-kind load docker-image --name=submarine apache/submarine:database-0.3.0-SNAPSHOT
+kind load docker-image --name=submarine apache/submarine:server-0.4.0
+kind load docker-image --name=submarine apache/submarine:database-0.4.0
 ```
diff --git a/submarine-commons/commons-cluster/pom.xml b/submarine-commons/commons-cluster/pom.xml
index fa6df6c..c986eac 100644
--- a/submarine-commons/commons-cluster/pom.xml
+++ b/submarine-commons/commons-cluster/pom.xml
@@ -23,11 +23,11 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-commons</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>submarine-commons-cluster</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Commons Cluster</name>
 
   <dependencies>
diff --git a/submarine-commons/commons-metastore/pom.xml b/submarine-commons/commons-metastore/pom.xml
index 56ac20a..3142249 100644
--- a/submarine-commons/commons-metastore/pom.xml
+++ b/submarine-commons/commons-metastore/pom.xml
@@ -25,13 +25,13 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-commons</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
   <groupId>org.apache.submarine</groupId>
   <artifactId>submarine-commons-metastore</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Commons MetaStore</name>
 
   <dependencies>
diff --git a/submarine-commons/commons-rpc/pom.xml b/submarine-commons/commons-rpc/pom.xml
index 8009244..edfae62 100644
--- a/submarine-commons/commons-rpc/pom.xml
+++ b/submarine-commons/commons-rpc/pom.xml
@@ -25,13 +25,13 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-commons</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
   <groupId>org.apache.submarine</groupId>
   <artifactId>submarine-commons-rpc</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Commons RPC</name>
 
   <dependencies>
diff --git a/submarine-commons/commons-runtime/pom.xml b/submarine-commons/commons-runtime/pom.xml
index 01f272b..a2cc2b2 100644
--- a/submarine-commons/commons-runtime/pom.xml
+++ b/submarine-commons/commons-runtime/pom.xml
@@ -24,13 +24,13 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-commons</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.apache.submarine</groupId>
   <artifactId>submarine-commons-runtime</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Commons Runtime</name>
 
   <dependencies>
diff --git a/submarine-commons/commons-unixusersync/pom.xml b/submarine-commons/commons-unixusersync/pom.xml
index a13d8b4..4d97e1b 100644
--- a/submarine-commons/commons-unixusersync/pom.xml
+++ b/submarine-commons/commons-unixusersync/pom.xml
@@ -25,13 +25,13 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-commons</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
   <groupId>org.apache.submarine</groupId>
   <artifactId>submarine-commons-unixusersync</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Commons Unixusersync</name>
 
   <dependencies>
diff --git a/submarine-commons/commons-utils/pom.xml b/submarine-commons/commons-utils/pom.xml
index 91f80e3..6e7a903 100644
--- a/submarine-commons/commons-utils/pom.xml
+++ b/submarine-commons/commons-utils/pom.xml
@@ -25,13 +25,13 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-commons</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
   <groupId>org.apache.submarine</groupId>
   <artifactId>submarine-commons-utils</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Commons Utils</name>
 
   <dependencies>
diff --git a/submarine-commons/pom.xml b/submarine-commons/pom.xml
index da83d9f..6fc29b2 100644
--- a/submarine-commons/pom.xml
+++ b/submarine-commons/pom.xml
@@ -23,14 +23,14 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.apache.submarine</groupId>
   <artifactId>submarine-commons</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <packaging>pom</packaging>
   <name>Submarine: Commons</name>
 
diff --git a/submarine-dist/pom.xml b/submarine-dist/pom.xml
index b97531a..ac18b56 100644
--- a/submarine-dist/pom.xml
+++ b/submarine-dist/pom.xml
@@ -25,11 +25,11 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>..</relativePath>
   </parent>
   <artifactId>submarine-dist</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Dist</name>
   <packaging>pom</packaging>
 
diff --git a/submarine-sdk/pysubmarine/example/pytorch/run_deepfm.sh b/submarine-sdk/pysubmarine/example/pytorch/run_deepfm.sh
index 3432e92..e09cfec 100644
--- a/submarine-sdk/pysubmarine/example/pytorch/run_deepfm.sh
+++ b/submarine-sdk/pysubmarine/example/pytorch/run_deepfm.sh
@@ -24,7 +24,7 @@
 
 HADOOP_CONF_PATH=${HADOOP_CONF_PATH:-$HADOOP_CONF_DIR}
 
-SUBMARINE_VERSION=0.4.0-SNAPSHOT
+SUBMARINE_VERSION=0.4.0
 SUBMARINE_HADOOP_VERSION=2.9
 SUBMARINE_JAR=/opt/submarine-dist-${SUBMARINE_VERSION}-hadoop-${SUBMARINE_HADOOP_VERSION}/submarine-dist-${SUBMARINE_VERSION}-hadoop-${SUBMARINE_HADOOP_VERSION}/submarine-all-${SUBMARINE_VERSION}-hadoop-${SUBMARINE_HADOOP_VERSION}.jar
 
@@ -38,4 +38,4 @@
  --worker_launch_cmd "JAVA_HOME=$JAVA_HOME HADOOP_HOME=$HADOOP_HOME CLASSPATH=$CLASSPATH ARROW_LIBHDFS_DIR=$ARROW_LIBHDFS_DIR PYTHONPATH=$PYTHONPATH sdk.zip/sdk/bin/python run_ctr.py --conf ./deepfm.json --task_type train" \
  --insecure \
  --conf tony.containers.resources=sdk.zip#archive,${SUBMARINE_JAR},run_ctr.py,deepfm.json
- 
+
diff --git a/submarine-sdk/pysubmarine/setup.py b/submarine-sdk/pysubmarine/setup.py
index a52020a..6b4a0a0 100644
--- a/submarine-sdk/pysubmarine/setup.py
+++ b/submarine-sdk/pysubmarine/setup.py
@@ -18,7 +18,7 @@
 
 setup(
     name='pysubmarine',
-    version='0.4.0-SNAPSHOT',
+    version='0.4.0',
     description="A python SDK for submarine",
     url="https://github.com/apache/submarine",
     packages=find_packages(exclude=['tests', 'tests.*']),
diff --git a/submarine-sdk/pysubmarine/submarine/experiment/__init__.py b/submarine-sdk/pysubmarine/submarine/experiment/__init__.py
index 97bb0cd..99216df 100644
--- a/submarine-sdk/pysubmarine/submarine/experiment/__init__.py
+++ b/submarine-sdk/pysubmarine/submarine/experiment/__init__.py
@@ -21,7 +21,7 @@
 
     The Submarine REST API allows you to create, list, and get experiments. The API is hosted under the /v1/experiment route on the Submarine server. For example, to list experiments on a server hosted at http://localhost:8080, access http://localhost:8080/api/v1/experiment/  # noqa: E501
 
-    The version of the OpenAPI document: 0.4.0-SNAPSHOT
+    The version of the OpenAPI document: 0.4.0
     Contact: dev@submarine.apache.org
     Generated by: https://openapi-generator.tech
 """
@@ -43,4 +43,4 @@
 from submarine.experiment.models.experiment_task_spec import ExperimentTaskSpec
 from submarine.experiment.models.json_response import JsonResponse
 
-__version__ = "0.4.0-SNAPSHOT"
+__version__ = "0.4.0"
diff --git a/submarine-sdk/pysubmarine/submarine/experiment/api/experiment_api.py b/submarine-sdk/pysubmarine/submarine/experiment/api/experiment_api.py
index e9f75e4..d5ae76a 100644
--- a/submarine-sdk/pysubmarine/submarine/experiment/api/experiment_api.py
+++ b/submarine-sdk/pysubmarine/submarine/experiment/api/experiment_api.py
@@ -20,7 +20,7 @@
 
     The Submarine REST API allows you to create, list, and get experiments. The API is hosted under the /v1/experiment route on the Submarine server. For example, to list experiments on a server hosted at http://localhost:8080, access http://localhost:8080/api/v1/experiment/  # noqa: E501
 
-    The version of the OpenAPI document: 0.4.0-SNAPSHOT
+    The version of the OpenAPI document: 0.4.0
     Contact: dev@submarine.apache.org
     Generated by: https://openapi-generator.tech
 """
diff --git a/submarine-sdk/pysubmarine/submarine/experiment/api_client.py b/submarine-sdk/pysubmarine/submarine/experiment/api_client.py
index 49b1bfd..fd83d36 100644
--- a/submarine-sdk/pysubmarine/submarine/experiment/api_client.py
+++ b/submarine-sdk/pysubmarine/submarine/experiment/api_client.py
@@ -19,7 +19,7 @@
 
     The Submarine REST API allows you to create, list, and get experiments. The API is hosted under the /v1/experiment route on the Submarine server. For example, to list experiments on a server hosted at http://localhost:8080, access http://localhost:8080/api/v1/experiment/  # noqa: E501
 
-    The version of the OpenAPI document: 0.4.0-SNAPSHOT
+    The version of the OpenAPI document: 0.4.0
     Contact: dev@submarine.apache.org
     Generated by: https://openapi-generator.tech
 """
@@ -98,7 +98,7 @@
             self.default_headers[header_name] = header_value
         self.cookie = cookie
         # Set default User-Agent.
-        self.user_agent = 'OpenAPI-Generator/0.4.0-SNAPSHOT/python'
+        self.user_agent = 'OpenAPI-Generator/0.4.0/python'
         self.client_side_validation = configuration.client_side_validation
 
     def __enter__(self):
diff --git a/submarine-sdk/pysubmarine/submarine/experiment/configuration.py b/submarine-sdk/pysubmarine/submarine/experiment/configuration.py
index 0372806..fb882f7 100644
--- a/submarine-sdk/pysubmarine/submarine/experiment/configuration.py
+++ b/submarine-sdk/pysubmarine/submarine/experiment/configuration.py
@@ -19,7 +19,7 @@
 
     The Submarine REST API allows you to create, list, and get experiments. The API is hosted under the /v1/experiment route on the Submarine server. For example, to list experiments on a server hosted at http://localhost:8080, access http://localhost:8080/api/v1/experiment/  # noqa: E501
 
-    The version of the OpenAPI document: 0.4.0-SNAPSHOT
+    The version of the OpenAPI document: 0.4.0
     Contact: dev@submarine.apache.org
     Generated by: https://openapi-generator.tech
 """
@@ -342,8 +342,8 @@
         return "Python SDK Debug Report:\n"\
                "OS: {env}\n"\
                "Python Version: {pyversion}\n"\
-               "Version of the API: 0.4.0-SNAPSHOT\n"\
-               "SDK Package Version: 0.4.0-SNAPSHOT".\
+               "Version of the API: 0.4.0\n"\
+               "SDK Package Version: 0.4.0".\
                format(env=sys.platform, pyversion=sys.version)
 
     def get_host_settings(self):
diff --git a/submarine-sdk/pysubmarine/submarine/experiment/exceptions.py b/submarine-sdk/pysubmarine/submarine/experiment/exceptions.py
index 471e830..2fe60c5 100644
--- a/submarine-sdk/pysubmarine/submarine/experiment/exceptions.py
+++ b/submarine-sdk/pysubmarine/submarine/experiment/exceptions.py
@@ -19,7 +19,7 @@
 
     The Submarine REST API allows you to create, list, and get experiments. The API is hosted under the /v1/experiment route on the Submarine server. For example, to list experiments on a server hosted at http://localhost:8080, access http://localhost:8080/api/v1/experiment/  # noqa: E501
 
-    The version of the OpenAPI document: 0.4.0-SNAPSHOT
+    The version of the OpenAPI document: 0.4.0
     Contact: dev@submarine.apache.org
     Generated by: https://openapi-generator.tech
 """
diff --git a/submarine-sdk/pysubmarine/submarine/experiment/models/__init__.py b/submarine-sdk/pysubmarine/submarine/experiment/models/__init__.py
index 4575e33..4ef6fbf 100644
--- a/submarine-sdk/pysubmarine/submarine/experiment/models/__init__.py
+++ b/submarine-sdk/pysubmarine/submarine/experiment/models/__init__.py
@@ -21,7 +21,7 @@
 
     The Submarine REST API allows you to create, list, and get experiments. The API is hosted under the /v1/experiment route on the Submarine server. For example, to list experiments on a server hosted at http://localhost:8080, access http://localhost:8080/api/v1/experiment/  # noqa: E501
 
-    The version of the OpenAPI document: 0.4.0-SNAPSHOT
+    The version of the OpenAPI document: 0.4.0
     Contact: dev@submarine.apache.org
     Generated by: https://openapi-generator.tech
 """
diff --git a/submarine-sdk/pysubmarine/submarine/experiment/models/environment.py b/submarine-sdk/pysubmarine/submarine/experiment/models/environment.py
index f43fa81..55a6e78 100644
--- a/submarine-sdk/pysubmarine/submarine/experiment/models/environment.py
+++ b/submarine-sdk/pysubmarine/submarine/experiment/models/environment.py
@@ -20,7 +20,7 @@
 
     The Submarine REST API allows you to create, list, and get experiments. The API is hosted under the /v1/experiment route on the Submarine server. For example, to list experiments on a server hosted at http://localhost:8080, access http://localhost:8080/api/v1/experiment/  # noqa: E501
 
-    The version of the OpenAPI document: 0.4.0-SNAPSHOT
+    The version of the OpenAPI document: 0.4.0
     Contact: dev@submarine.apache.org
     Generated by: https://openapi-generator.tech
 """
diff --git a/submarine-sdk/pysubmarine/submarine/experiment/models/experiment_meta.py b/submarine-sdk/pysubmarine/submarine/experiment/models/experiment_meta.py
index 765d899..9fec0b1 100644
--- a/submarine-sdk/pysubmarine/submarine/experiment/models/experiment_meta.py
+++ b/submarine-sdk/pysubmarine/submarine/experiment/models/experiment_meta.py
@@ -20,7 +20,7 @@
 
     The Submarine REST API allows you to create, list, and get experiments. The API is hosted under the /v1/experiment route on the Submarine server. For example, to list experiments on a server hosted at http://localhost:8080, access http://localhost:8080/api/v1/experiment/  # noqa: E501
 
-    The version of the OpenAPI document: 0.4.0-SNAPSHOT
+    The version of the OpenAPI document: 0.4.0
     Contact: dev@submarine.apache.org
     Generated by: https://openapi-generator.tech
 """
diff --git a/submarine-sdk/pysubmarine/submarine/experiment/models/experiment_spec.py b/submarine-sdk/pysubmarine/submarine/experiment/models/experiment_spec.py
index 7b013d4..aabb127 100644
--- a/submarine-sdk/pysubmarine/submarine/experiment/models/experiment_spec.py
+++ b/submarine-sdk/pysubmarine/submarine/experiment/models/experiment_spec.py
@@ -20,7 +20,7 @@
 
     The Submarine REST API allows you to create, list, and get experiments. The API is hosted under the /v1/experiment route on the Submarine server. For example, to list experiments on a server hosted at http://localhost:8080, access http://localhost:8080/api/v1/experiment/  # noqa: E501
 
-    The version of the OpenAPI document: 0.4.0-SNAPSHOT
+    The version of the OpenAPI document: 0.4.0
     Contact: dev@submarine.apache.org
     Generated by: https://openapi-generator.tech
 """
diff --git a/submarine-sdk/pysubmarine/submarine/experiment/models/experiment_task_spec.py b/submarine-sdk/pysubmarine/submarine/experiment/models/experiment_task_spec.py
index 3245738..a673b14 100644
--- a/submarine-sdk/pysubmarine/submarine/experiment/models/experiment_task_spec.py
+++ b/submarine-sdk/pysubmarine/submarine/experiment/models/experiment_task_spec.py
@@ -20,7 +20,7 @@
 
     The Submarine REST API allows you to create, list, and get experiments. The API is hosted under the /v1/experiment route on the Submarine server. For example, to list experiments on a server hosted at http://localhost:8080, access http://localhost:8080/api/v1/experiment/  # noqa: E501
 
-    The version of the OpenAPI document: 0.4.0-SNAPSHOT
+    The version of the OpenAPI document: 0.4.0
     Contact: dev@submarine.apache.org
     Generated by: https://openapi-generator.tech
 """
diff --git a/submarine-sdk/pysubmarine/submarine/experiment/models/json_response.py b/submarine-sdk/pysubmarine/submarine/experiment/models/json_response.py
index 7ca5494..245dd23 100644
--- a/submarine-sdk/pysubmarine/submarine/experiment/models/json_response.py
+++ b/submarine-sdk/pysubmarine/submarine/experiment/models/json_response.py
@@ -20,7 +20,7 @@
 
     The Submarine REST API allows you to create, list, and get experiments. The API is hosted under the /v1/experiment route on the Submarine server. For example, to list experiments on a server hosted at http://localhost:8080, access http://localhost:8080/api/v1/experiment/  # noqa: E501
 
-    The version of the OpenAPI document: 0.4.0-SNAPSHOT
+    The version of the OpenAPI document: 0.4.0
     Contact: dev@submarine.apache.org
     Generated by: https://openapi-generator.tech
 """
diff --git a/submarine-sdk/pysubmarine/submarine/experiment/rest.py b/submarine-sdk/pysubmarine/submarine/experiment/rest.py
index f9e6f58..3a1e0a6 100644
--- a/submarine-sdk/pysubmarine/submarine/experiment/rest.py
+++ b/submarine-sdk/pysubmarine/submarine/experiment/rest.py
@@ -19,7 +19,7 @@
 
     The Submarine REST API allows you to create, list, and get experiments. The API is hosted under the /v1/experiment route on the Submarine server. For example, to list experiments on a server hosted at http://localhost:8080, access http://localhost:8080/api/v1/experiment/  # noqa: E501
 
-    The version of the OpenAPI document: 0.4.0-SNAPSHOT
+    The version of the OpenAPI document: 0.4.0
     Contact: dev@submarine.apache.org
     Generated by: https://openapi-generator.tech
 """
diff --git a/submarine-security/spark-security/pom.xml b/submarine-security/spark-security/pom.xml
index 99b1cc1..b44ee61 100644
--- a/submarine-security/spark-security/pom.xml
+++ b/submarine-security/spark-security/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <artifactId>submarine</artifactId>
     <groupId>org.apache.submarine</groupId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
diff --git a/submarine-server/pom.xml b/submarine-server/pom.xml
index af28622..d451484 100644
--- a/submarine-server/pom.xml
+++ b/submarine-server/pom.xml
@@ -24,12 +24,12 @@
   <parent>
     <artifactId>submarine</artifactId>
     <groupId>org.apache.submarine</groupId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
   <artifactId>submarine-server</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <packaging>pom</packaging>
   <name>Submarine: Server</name>
 
diff --git a/submarine-server/server-api/pom.xml b/submarine-server/server-api/pom.xml
index 5c657d8..7dc1be8 100644
--- a/submarine-server/server-api/pom.xml
+++ b/submarine-server/server-api/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <artifactId>submarine-server</artifactId>
     <groupId>org.apache.submarine</groupId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
diff --git a/submarine-server/server-core/pom.xml b/submarine-server/server-core/pom.xml
index 0917f48..3bf65e8 100644
--- a/submarine-server/server-core/pom.xml
+++ b/submarine-server/server-core/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <artifactId>submarine-server</artifactId>
     <groupId>org.apache.submarine</groupId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
diff --git a/submarine-server/server-core/src/main/java/org/apache/submarine/server/Bootstrap.java b/submarine-server/server-core/src/main/java/org/apache/submarine/server/Bootstrap.java
index 2e7192a..953d52a 100644
--- a/submarine-server/server-core/src/main/java/org/apache/submarine/server/Bootstrap.java
+++ b/submarine-server/server-core/src/main/java/org/apache/submarine/server/Bootstrap.java
@@ -49,7 +49,7 @@
              .termsOfService("http://swagger.io/terms/")
              .contact(new Contact()
              .email("dev@submarine.apache.org"))
-             .version("0.4.0-SNAPSHOT")
+             .version("0.4.0")
              .license(new License()
              .name("Apache 2.0")
              .url("http://www.apache.org/licenses/LICENSE-2.0.html"));
diff --git a/submarine-server/server-rpc/pom.xml b/submarine-server/server-rpc/pom.xml
index 53cd7ac..a2b300c 100644
--- a/submarine-server/server-rpc/pom.xml
+++ b/submarine-server/server-rpc/pom.xml
@@ -24,12 +24,12 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-server</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
   <artifactId>submarine-server-rpc</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Server RPC</name>
 
   <dependencies>
diff --git a/submarine-server/server-submitter/pom.xml b/submarine-server/server-submitter/pom.xml
index a5ba015..9db9da1 100644
--- a/submarine-server/server-submitter/pom.xml
+++ b/submarine-server/server-submitter/pom.xml
@@ -24,12 +24,12 @@
   <parent>
     <artifactId>submarine-server</artifactId>
     <groupId>org.apache.submarine</groupId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
   <artifactId>submarine-server-submitter</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <packaging>pom</packaging>
   <name>Submarine: Submitter</name>
 
diff --git a/submarine-server/server-submitter/submitter-k8s/pom.xml b/submarine-server/server-submitter/submitter-k8s/pom.xml
index 9d0e202..d914ced 100644
--- a/submarine-server/server-submitter/submitter-k8s/pom.xml
+++ b/submarine-server/server-submitter/submitter-k8s/pom.xml
@@ -24,12 +24,12 @@
   <parent>
     <artifactId>submarine-server-submitter</artifactId>
     <groupId>org.apache.submarine</groupId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
   <artifactId>submarine-submitter-k8s</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Kubernetes Submitter</name>
 
   <dependencies>
diff --git a/submarine-server/server-submitter/submitter-yarn/pom.xml b/submarine-server/server-submitter/submitter-yarn/pom.xml
index c219056..55545bd 100644
--- a/submarine-server/server-submitter/submitter-yarn/pom.xml
+++ b/submarine-server/server-submitter/submitter-yarn/pom.xml
@@ -20,12 +20,12 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-server-submitter</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
   <artifactId>submarine-submitter-yarn</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: YARN Submitter</name>
 
   <dependencies>
diff --git a/submarine-server/server-submitter/submitter-yarnservice/pom.xml b/submarine-server/server-submitter/submitter-yarnservice/pom.xml
index 09c1e8f..8611853 100644
--- a/submarine-server/server-submitter/submitter-yarnservice/pom.xml
+++ b/submarine-server/server-submitter/submitter-yarnservice/pom.xml
@@ -25,11 +25,11 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-server-submitter</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
   </parent>
 
   <artifactId>submarine-submitter-yarnservice</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: YARN Service Submitter</name>
 
   <properties>
diff --git a/submarine-test/pom.xml b/submarine-test/pom.xml
index 6c0667e..0d15ca6 100644
--- a/submarine-test/pom.xml
+++ b/submarine-test/pom.xml
@@ -25,10 +25,10 @@
   <parent>
     <artifactId>submarine</artifactId>
     <groupId>org.apache.submarine</groupId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
   </parent>
   <artifactId>submarine-test</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Test</name>
   <packaging>pom</packaging>
 
diff --git a/submarine-test/test-e2e/pom.xml b/submarine-test/test-e2e/pom.xml
index 71bdea9..aee6d22 100644
--- a/submarine-test/test-e2e/pom.xml
+++ b/submarine-test/test-e2e/pom.xml
@@ -25,11 +25,11 @@
   <parent>
     <artifactId>submarine-test</artifactId>
     <groupId>org.apache.submarine</groupId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
   </parent>
 
   <artifactId>submarine-test-e2e</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: E2E Test</name>
 
   <properties>
diff --git a/submarine-test/test-k8s/pom.xml b/submarine-test/test-k8s/pom.xml
index 1232180..e36191c 100644
--- a/submarine-test/test-k8s/pom.xml
+++ b/submarine-test/test-k8s/pom.xml
@@ -25,11 +25,11 @@
   <parent>
     <artifactId>submarine-test</artifactId>
     <groupId>org.apache.submarine</groupId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
   </parent>
 
   <artifactId>submarine-test-k8s</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Kubernetes Test</name>
 
   <properties>
diff --git a/submarine-workbench/interpreter/interpreter-core/pom.xml b/submarine-workbench/interpreter/interpreter-core/pom.xml
index 6cd4e3a..cb585b9 100644
--- a/submarine-workbench/interpreter/interpreter-core/pom.xml
+++ b/submarine-workbench/interpreter/interpreter-core/pom.xml
@@ -26,12 +26,12 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-interpreter</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
   <artifactId>submarine-interpreter-core</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Interpreter Core</name>
   <description>Submarine Interpreter Core</description>
 
diff --git a/submarine-workbench/interpreter/pom.xml b/submarine-workbench/interpreter/pom.xml
index d2fcde9..28e20fd 100644
--- a/submarine-workbench/interpreter/pom.xml
+++ b/submarine-workbench/interpreter/pom.xml
@@ -26,12 +26,12 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-workbench</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
   <artifactId>submarine-interpreter</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <packaging>pom</packaging>
   <name>Submarine: Interpreter</name>
   <description>Submarine Interpreter Parent</description>
diff --git a/submarine-workbench/interpreter/python-interpreter/README.md b/submarine-workbench/interpreter/python-interpreter/README.md
index 0236fc3..c2d8627 100644
--- a/submarine-workbench/interpreter/python-interpreter/README.md
+++ b/submarine-workbench/interpreter/python-interpreter/README.md
@@ -18,10 +18,10 @@
 
 ### Execute test command
 ```
-java -jar python-interpreter-0.4.0-SNAPSHOT-shade.jar python python-interpreter-id test
+java -jar python-interpreter-0.4.0-shade.jar python python-interpreter-id test
 ```
 
-### Print test result 
+### Print test result
 ```
  INFO [2019-10-14 10:35:11,653] ({main} SubmarinePythonInterpreter.java[test]:111) - Execution Python Interpreter, Calculation formula 1 + 1, Result = 2
  INFO [2019-10-14 10:35:11,653] ({main} InterpreterProcess.java[main]:68) - Interpreter test result: true
@@ -33,7 +33,7 @@
 ### Execute debug command
 
 ```
-java -jar python-interpreter-0.4.0-SNAPSHOT-shade.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 python python-interpreter-id
+java -jar python-interpreter-0.4.0-shade.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 python python-interpreter-id
 ```
 
 Connect via remote debugging in IDEA
diff --git a/submarine-workbench/interpreter/python-interpreter/pom.xml b/submarine-workbench/interpreter/python-interpreter/pom.xml
index 2e6a0b3..ff27815 100644
--- a/submarine-workbench/interpreter/python-interpreter/pom.xml
+++ b/submarine-workbench/interpreter/python-interpreter/pom.xml
@@ -26,12 +26,12 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-interpreter</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
   <artifactId>submarine-python-interpreter</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Interpreter Python</name>
   <description>Submarine Python Interpreter</description>
 
diff --git a/submarine-workbench/interpreter/spark-interpreter/pom.xml b/submarine-workbench/interpreter/spark-interpreter/pom.xml
index 9f0ca98..6037eaf 100644
--- a/submarine-workbench/interpreter/spark-interpreter/pom.xml
+++ b/submarine-workbench/interpreter/spark-interpreter/pom.xml
@@ -26,12 +26,12 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-interpreter</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
   <artifactId>submarine-spark-interpreter</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Interpreter Spark</name>
   <description>Submarine spark Interpreter</description>
 
diff --git a/submarine-workbench/pom.xml b/submarine-workbench/pom.xml
index da9f0c9..0cc6156 100644
--- a/submarine-workbench/pom.xml
+++ b/submarine-workbench/pom.xml
@@ -26,12 +26,12 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
   <artifactId>submarine-workbench</artifactId>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <packaging>pom</packaging>
   <name>Submarine: Workbench</name>
   <description>Submarine Workbench</description>
diff --git a/submarine-workbench/workbench-web-ng/pom.xml b/submarine-workbench/workbench-web-ng/pom.xml
index 4be602d..7cd7578 100644
--- a/submarine-workbench/workbench-web-ng/pom.xml
+++ b/submarine-workbench/workbench-web-ng/pom.xml
@@ -25,14 +25,14 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-workbench</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
   <groupId>org.apache.submarine</groupId>
   <artifactId>submarine-workbench-web-ng</artifactId>
   <packaging>war</packaging>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Workbench Web Angular</name>
 
   <!-- See https://github.com/eirslett/frontend-maven-plugin/issues/229 -->
diff --git a/submarine-workbench/workbench-web/pom.xml b/submarine-workbench/workbench-web/pom.xml
index 063d99c..1581319 100644
--- a/submarine-workbench/workbench-web/pom.xml
+++ b/submarine-workbench/workbench-web/pom.xml
@@ -23,14 +23,14 @@
   <parent>
     <groupId>org.apache.submarine</groupId>
     <artifactId>submarine-workbench</artifactId>
-    <version>0.4.0-SNAPSHOT</version>
+    <version>0.4.0</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
   <groupId>org.apache.submarine</groupId>
   <artifactId>submarine-workbench-web</artifactId>
   <packaging>war</packaging>
-  <version>0.4.0-SNAPSHOT</version>
+  <version>0.4.0</version>
   <name>Submarine: Workbench Web</name>
 
   <!-- See https://github.com/eirslett/frontend-maven-plugin/issues/229 -->