Repository: kubeflow/kfp-tekton (language: python)

Issue:
rebase kfp-tekton to kfp 1.5.0 release
/kind feature

**Description:**
/assign @ckadner

Note: kfp 1.5.0 sdk doesn't have a release yet because they are working on some v2 changes.

**Additional information:**
[Miscellaneous information that will assist in solving the issue.]



Discussion / hints:

Fix patch:
diff --git a/README.md b/README.md
index bd49463eeb..2c9624d6a1 100644
--- a/README.md
+++ b/README.md
@@ -1,23 +1,32 @@
 # Kubeflow Pipelines with Tekton
 
-Project bringing Kubeflow Pipelines and Tekton together. The project is driven according to this [design doc](http://bit.ly/kfp-tekton). The current code allows you run Kubeflow Pipelines with Tekton backend end to end.
+Project bringing Kubeflow Pipelines and Tekton together. The project is driven
+according to this [design doc](http://bit.ly/kfp-tekton). The current code allows
+you run Kubeflow Pipelines with Tekton backend end to end.
 
 * Create your Pipeline using Kubeflow Pipelines DSL, and compile it to Tekton YAML.
-* Upload the compiled Tekton YAML to KFP engine (API and UI), and run end to end with logging and artifacts tracking enabled.
+* Upload the compiled Tekton YAML to KFP engine (API and UI), and run end to end
+  with logging and artifacts tracking enabled.
 
-For more details about the project please follow this detailed [blog post](https://developer.ibm.com/blogs/kubeflow-pipelines-with-tekton-and-watson/). Additionally look at these [slides](https://www.slideshare.net/AnimeshSingh/kubeflow-pipelines-with-tekton-236769976) and the [deep dive presentation](https://www.youtube.com/watch?v=AYIeNtXLT_k) for demos.
+For more details about the project please follow this detailed [blog post](https://developer.ibm.com/blogs/kubeflow-pipelines-with-tekton-and-watson/).
+Additionally, look at these [slides](https://www.slideshare.net/AnimeshSingh/kubeflow-pipelines-with-tekton-236769976)
+as well as this [deep dive presentation](https://www.youtube.com/watch?v=AYIeNtXLT_k)
+for demos.
 
 ## Tekton
 
-The Tekton Pipelines project provides Kubernetes-style resources for declaring CI/CD-style pipelines. Tekton introduces
-several new [Custom Resource Definitions](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) (CRDs) including Task, Pipeline, TaskRun, and PipelineRun. A PipelineRun represents a single running instance
-of a Pipeline and is responsible for creating a Pod for each of its Tasks and as many containers within each Pod as it
-has Steps. Please look for more details in [Tekton repo](https://github.com/tektoncd/pipeline).
+The Tekton Pipelines project provides Kubernetes-style resources for declaring
+CI/CD-style pipelines. Tekton introduces several new [Custom Resource Definitions](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/)
+(CRDs) including Task, Pipeline, TaskRun, and PipelineRun. A PipelineRun represents
+a single running instance of a Pipeline and is responsible for creating a Pod for
+each of its Tasks and as many containers within each Pod as it has Steps. Please
+look for more details in [Tekton repo](https://github.com/tektoncd/pipeline).
 
 ## Kubeflow Pipeline with Tekton Backend
 
-We are currently using [Kubeflow Pipelines 1.5.0-rc.2](https://github.com/kubeflow/pipelines/releases/tag/1.5.0-rc.2) and
-[Tekton >= 0.21.0](https://github.com/tektoncd/pipeline/releases/tag/v0.21.0) for this project.
+We are currently using [Kubeflow Pipelines 1.5.0](https://github.com/kubeflow/pipelines/releases/tag/1.5.0) and
+[Tekton >= 0.21.0](https://github.com/tektoncd/pipeline/releases/tag/v0.21.0)
+for this project.
 
 ![kfp-tekton](images/kfp-tekton.png)
 
diff --git a/VERSION b/VERSION
index 0912fa30ff..a3df0a6959 100644
--- a/VERSION
+++ b/VERSION
@@ -1,1 +1,1 @@
-0.8.0-rc.0
+0.8.0
diff --git a/backend/api/python_http_client/README.md b/backend/api/python_http_client/README.md
index 8637e9e174..9c8d4cb3e8 100644
--- a/backend/api/python_http_client/README.md
+++ b/backend/api/python_http_client/README.md
@@ -3,8 +3,8 @@ This file contains REST API specification for Kubeflow Pipelines. The file is au
 
 This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
 
-- API version: 1.5.0-rc.2
-- Package version: 1.5.0-rc.2
+- API version: 1.5.0
+- Package version: 1.5.0
 - Build package: org.openapitools.codegen.languages.PythonClientCodegen
 For more information, please visit [https://www.google.com](https://www.google.com)
 
diff --git a/backend/api/python_http_client/kfp_server_api/__init__.py b/backend/api/python_http_client/kfp_server_api/__init__.py
index 8995c76e30..24ad999cc5 100644
--- a/backend/api/python_http_client/kfp_server_api/__init__.py
+++ b/backend/api/python_http_client/kfp_server_api/__init__.py
@@ -14,7 +14,7 @@
 
 from __future__ import absolute_import
 
-__version__ = "1.5.0-rc.2"
+__version__ = "1.5.0"
 
 # import apis into sdk package
 from kfp_server_api.api.experiment_service_api import ExperimentServiceApi
diff --git a/backend/api/python_http_client/kfp_server_api/api_client.py b/backend/api/python_http_client/kfp_server_api/api_client.py
index 2d4d6e93bd..958dc9ffc4 100644
--- a/backend/api/python_http_client/kfp_server_api/api_client.py
+++ b/backend/api/python_http_client/kfp_server_api/api_client.py
@@ -78,7 +78,7 @@ def __init__(self, configuration=None, header_name=None, header_value=None,
             self.default_headers[header_name] = header_value
         self.cookie = cookie
         # Set default User-Agent.
-        self.user_agent = 'OpenAPI-Generator/1.5.0-rc.2/python'
+        self.user_agent = 'OpenAPI-Generator/1.5.0/python'
         self.client_side_validation = configuration.client_side_validation
 
     def __enter__(self):
diff --git a/backend/api/python_http_client/kfp_server_api/configuration.py b/backend/api/python_http_client/kfp_server_api/configuration.py
index e9b88e9ef3..5ca3dee01a 100644
--- a/backend/api/python_http_client/kfp_server_api/configuration.py
+++ b/backend/api/python_http_client/kfp_server_api/configuration.py
@@ -351,8 +351,8 @@ def to_debug_report(self):
         return "Python SDK Debug Report:\n"\
                "OS: {env}\n"\
                "Python Version: {pyversion}\n"\
-               "Version of the API: 1.5.0-rc.2\n"\
-               "SDK Package Version: 1.5.0-rc.2".\
+               "Version of the API: 1.5.0\n"\
+               "SDK Package Version: 1.5.0".\
                format(env=sys.platform, pyversion=sys.version)
 
     def get_host_settings(self):
diff --git a/backend/api/python_http_client/setup.py b/backend/api/python_http_client/setup.py
index d953598544..ee5590becc 100644
--- a/backend/api/python_http_client/setup.py
+++ b/backend/api/python_http_client/setup.py
@@ -13,7 +13,7 @@
 from setuptools import setup, find_packages  # noqa: H301
 
 NAME = "kfp-server-api"
-VERSION = "1.5.0-rc.2"
+VERSION = "1.5.0"
 # To install the library, run the following
 #
 # python setup.py install
diff --git a/backend/api/swagger/kfp_api_single_file.swagger.json b/backend/api/swagger/kfp_api_single_file.swagger.json
index fbda2e1318..7034f8cad2 100644
--- a/backend/api/swagger/kfp_api_single_file.swagger.json
+++ b/backend/api/swagger/kfp_api_single_file.swagger.json
@@ -2,7 +2,7 @@
   "swagger": "2.0",
   "info": {
     "title": "Kubeflow Pipelines API",
-    "version": "1.5.0-rc.2",
+    "version": "1.5.0",
     "description": "This file contains REST API specification for Kubeflow Pipelines. The file is autogenerated from the swagger definition.",
     "contact": {
       "name": "google",
diff --git a/components/README.md b/components/README.md
index 98ab7f1aa0..1acc5ed405 100644
--- a/components/README.md
+++ b/components/README.md
@@ -179,37 +179,37 @@ Also see the tutorials for [data passing for components based on python function
 
  / [gcp](https://github.com/kubeflow/pipelines/tree/0795597562e076437a21745e524b5c960b1edb68/components/gcp) / [automl](https://github.com/kubeflow/pipelines/tree/0795597562e076437a21745e524b5c960b1edb68/components/gcp/automl) / [split_dataset_table_column_names](https://github.com/kubeflow/pipelines/tree/0795597562e076437a21745e524b5c960b1edb68/components/gcp/automl/split_dataset_table_column_names) / [Automl split dataset table column names](https://raw.githubusercontent.com/kubeflow/pipelines/0795597562e076437a21745e524b5c960b1edb68/components/gcp/automl/split_dataset_table_column_names/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [bigquery](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery) / [query](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery/query) / [to_CSV](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery/query/to_CSV) / [Bigquery - Query](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/bigquery/query/to_CSV/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [bigquery](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery) / [query](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery/query) / [to_CSV](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery/query/to_CSV) / [Bigquery - Query](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/bigquery/query/to_CSV/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [bigquery](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery) / [query](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery/query) / [to_gcs](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery/query/to_gcs) / [Bigquery - Query](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/bigquery/query/to_gcs/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [bigquery](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery) / [query](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery/query) / [to_gcs](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery/query/to_gcs) / [Bigquery - Query](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/bigquery/query/to_gcs/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [bigquery](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery) / [query](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery/query) / [to_table](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery/query/to_table) / [Bigquery - Query](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/bigquery/query/to_table/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [bigquery](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery) / [query](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery/query) / [to_table](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/bigquery/query/to_table) / [Bigquery - Query](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/bigquery/query/to_table/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataflow](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataflow) / [launch_python](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataflow/launch_python) / [Launch Python](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataflow/launch_python/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataflow](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataflow) / [launch_python](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataflow/launch_python) / [Launch Python](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataflow/launch_python/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataflow](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataflow) / [launch_template](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataflow/launch_template) / [Launch Dataflow Template](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataflow/launch_template/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataflow](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataflow) / [launch_template](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataflow/launch_template) / [Launch Dataflow Template](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataflow/launch_template/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [create_cluster](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/create_cluster) / [dataproc_create_cluster](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/create_cluster/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [create_cluster](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/create_cluster) / [dataproc_create_cluster](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/create_cluster/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [delete_cluster](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/delete_cluster) / [dataproc_delete_cluster](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/delete_cluster/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [delete_cluster](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/delete_cluster) / [dataproc_delete_cluster](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/delete_cluster/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [submit_hadoop_job](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/submit_hadoop_job) / [dataproc_submit_hadoop_job](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_hadoop_job/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [submit_hadoop_job](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/submit_hadoop_job) / [dataproc_submit_hadoop_job](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_hadoop_job/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [submit_hive_job](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/submit_hive_job) / [dataproc_submit_hive_job](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_hive_job/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [submit_hive_job](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/submit_hive_job) / [dataproc_submit_hive_job](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_hive_job/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [submit_pig_job](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/submit_pig_job) / [dataproc_submit_pig_job](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_pig_job/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [submit_pig_job](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/submit_pig_job) / [dataproc_submit_pig_job](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_pig_job/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [submit_pyspark_job](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/submit_pyspark_job) / [dataproc_submit_pyspark_job](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_pyspark_job/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [submit_pyspark_job](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/submit_pyspark_job) / [dataproc_submit_pyspark_job](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_pyspark_job/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [submit_spark_job](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/submit_spark_job) / [dataproc_submit_spark_job](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_spark_job/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [submit_spark_job](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/submit_spark_job) / [dataproc_submit_spark_job](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_spark_job/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [submit_sparksql_job](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/submit_sparksql_job) / [dataproc_submit_sparksql_job](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_sparksql_job/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [dataproc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc) / [submit_sparksql_job](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/dataproc/submit_sparksql_job) / [dataproc_submit_sparksql_job](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_sparksql_job/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [ml_engine](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/ml_engine) / [batch_predict](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/ml_engine/batch_predict) / [Batch predict against a model with Cloud ML Engine](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/ml_engine/batch_predict/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [ml_engine](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/ml_engine) / [batch_predict](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/ml_engine/batch_predict) / [Batch predict against a model with Cloud ML Engine](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/ml_engine/batch_predict/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [ml_engine](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/ml_engine) / [deploy](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/ml_engine/deploy) / [Deploying a trained model to Cloud Machine Learning Engine](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/ml_engine/deploy/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [ml_engine](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/ml_engine) / [deploy](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/ml_engine/deploy) / [Deploying a trained model to Cloud Machine Learning Engine](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/ml_engine/deploy/component.yaml)
 
- / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [ml_engine](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/ml_engine) / [train](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/ml_engine/train) / [Submitting a Cloud ML training job as a pipeline step](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/ml_engine/train/component.yaml)
+ / [gcp](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp) / [ml_engine](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/ml_engine) / [train](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/gcp/ml_engine/train) / [Submitting a Cloud ML training job as a pipeline step](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/ml_engine/train/component.yaml)
 
  / [git](https://github.com/kubeflow/pipelines/tree/0795597562e076437a21745e524b5c960b1edb68/components/git) / [clone](https://github.com/kubeflow/pipelines/tree/0795597562e076437a21745e524b5c960b1edb68/components/git/clone) / [Git clone](https://raw.githubusercontent.com/kubeflow/pipelines/0795597562e076437a21745e524b5c960b1edb68/components/git/clone/component.yaml)
 
@@ -273,9 +273,9 @@ Also see the tutorials for [data passing for components based on python function
 
  / [keras](https://github.com/kubeflow/pipelines/tree/0795597562e076437a21745e524b5c960b1edb68/components/keras) / [Train_classifier](https://github.com/kubeflow/pipelines/tree/0795597562e076437a21745e524b5c960b1edb68/components/keras/Train_classifier) / [from_CSV](https://github.com/kubeflow/pipelines/tree/0795597562e076437a21745e524b5c960b1edb68/components/keras/Train_classifier/from_CSV) / [Keras train classifier from csv](https://raw.githubusercontent.com/kubeflow/pipelines/0795597562e076437a21745e524b5c960b1edb68/components/keras/Train_classifier/from_CSV/component.yaml)
 
- / [kubeflow](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/kubeflow) / [deployer](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/kubeflow/deployer) / [Kubeflow - Serve TF model](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/kubeflow/deployer/component.yaml)
+ / [kubeflow](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/kubeflow) / [deployer](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/kubeflow/deployer) / [Kubeflow - Serve TF model](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/kubeflow/deployer/component.yaml)
 
- / [kubeflow](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/kubeflow) / [dnntrainer](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/kubeflow/dnntrainer) / [Train FC DNN using TF](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/kubeflow/dnntrainer/component.yaml)
+ / [kubeflow](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/kubeflow) / [dnntrainer](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/kubeflow/dnntrainer) / [Train FC DNN using TF](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/kubeflow/dnntrainer/component.yaml)
 
  / [kubeflow](https://github.com/kubeflow/pipelines/tree/34d23aa924720ead13fe67ebca5c1ab9926585ee/components/kubeflow) / [katib-launcher](https://github.com/kubeflow/pipelines/tree/34d23aa924720ead13fe67ebca5c1ab9926585ee/components/kubeflow/katib-launcher) / [Katib - Launch Experiment](https://raw.githubusercontent.com/kubeflow/pipelines/34d23aa924720ead13fe67ebca5c1ab9926585ee/components/kubeflow/katib-launcher/component.yaml)
 
@@ -283,9 +283,9 @@ Also see the tutorials for [data passing for components based on python function
 
  / [kubeflow](https://github.com/kubeflow/pipelines/tree/dd31142a57053e0b6f1416a3ecb4c8a94faa27f9/components/kubeflow) / [launcher](https://github.com/kubeflow/pipelines/tree/dd31142a57053e0b6f1416a3ecb4c8a94faa27f9/components/kubeflow/launcher) / [Kubeflow - Launch TFJob](https://raw.githubusercontent.com/kubeflow/pipelines/dd31142a57053e0b6f1416a3ecb4c8a94faa27f9/components/kubeflow/launcher/component.yaml)
 
- / [local](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/local) / [confusion_matrix](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/local/confusion_matrix) / [Confusion matrix](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/local/confusion_matrix/component.yaml)
+ / [local](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/local) / [confusion_matrix](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/local/confusion_matrix) / [Confusion matrix](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/local/confusion_matrix/component.yaml)
 
- / [local](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/local) / [roc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/local/roc) / [ROC curve](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/local/roc/component.yaml)
+ / [local](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/local) / [roc](https://github.com/kubeflow/pipelines/tree/8b3d741c6ef9f80190c962d4640690ea723b71e9/components/local/roc) / [ROC curve](https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/local/roc/component.yaml)
 
  / [ml_metrics](https://github.com/kubeflow/pipelines/tree/0795597562e076437a21745e524b5c960b1edb68/components/ml_metrics) / [Aggregate_regression_metrics](https://github.com/kubeflow/pipelines/tree/0795597562e076437a21745e524b5c960b1edb68/components/ml_metrics/Aggregate_regression_metrics) / [Aggregate regression metrics](https://raw.githubusercontent.com/kubeflow/pipelines/0795597562e076437a21745e524b5c960b1edb68/components/ml_metrics/Aggregate_regression_metrics/component.yaml)
 
diff --git a/components/gcp/bigquery/query/to_CSV/component.yaml b/components/gcp/bigquery/query/to_CSV/component.yaml
index 3c324a2526..6407ac9acd 100644
--- a/components/gcp/bigquery/query/to_CSV/component.yaml
+++ b/components/gcp/bigquery/query/to_CSV/component.yaml
@@ -47,7 +47,7 @@ outputs:
     type: CSV
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path,   {outputPath: MLPipeline UI metadata},
       kfp_component.google.bigquery, query,
diff --git a/components/gcp/bigquery/query/to_gcs/component.yaml b/components/gcp/bigquery/query/to_gcs/component.yaml
index a90a8a3277..dc2e6e8693 100644
--- a/components/gcp/bigquery/query/to_gcs/component.yaml
+++ b/components/gcp/bigquery/query/to_gcs/component.yaml
@@ -69,7 +69,7 @@ outputs:
     type: UI metadata
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path, {outputPath: MLPipeline UI metadata},
       kfp_component.google.bigquery, query,
diff --git a/components/gcp/bigquery/query/to_table/README.md b/components/gcp/bigquery/query/to_table/README.md
index 880c01f7d6..02b8838e47 100644
--- a/components/gcp/bigquery/query/to_table/README.md
+++ b/components/gcp/bigquery/query/to_table/README.md
@@ -77,7 +77,7 @@ Note: The following sample code works in an IPython notebook or directly in Pyth
 import kfp.components as comp
 
 bigquery_query_op = comp.load_component_from_url(
-    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/bigquery/query/to_table/component.yaml')
+    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/bigquery/query/to_table/component.yaml')
 help(bigquery_query_op)
 ```
 
diff --git a/components/gcp/bigquery/query/to_table/component.yaml b/components/gcp/bigquery/query/to_table/component.yaml
index 00614d488f..c989f7594d 100644
--- a/components/gcp/bigquery/query/to_table/component.yaml
+++ b/components/gcp/bigquery/query/to_table/component.yaml
@@ -49,14 +49,12 @@ inputs:
       for details.
     default: ''
     type: Dict
-  - name: table
-    type: String
 outputs:
   - name: MLPipeline UI metadata
     type: UI metadata
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path, {outputPath: MLPipeline UI metadata},
       kfp_component.google.bigquery, query,
diff --git a/components/gcp/container/component_sdk/python/kfp_component/google/ml_engine/_client.py b/components/gcp/container/component_sdk/python/kfp_component/google/ml_engine/_client.py
index aff58d9437..4d0cfdbac6 100644
--- a/components/gcp/container/component_sdk/python/kfp_component/google/ml_engine/_client.py
+++ b/components/gcp/container/component_sdk/python/kfp_component/google/ml_engine/_client.py
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from functools import wraps
 import logging
 import time
 
@@ -19,12 +20,53 @@
 from googleapiclient import errors
 from ..common import wait_operation_done
 
+
+def _retry(func, tries=5, delay=1):
+    """Retry decorator for methods in MLEngineClient class.
+
+    It bypasses the BrokenPipeError by directly accessing the `_build_client` method
+    and rebuilds `_ml_client` after `delay` seconds.
+
+    Args:
+         tries (int): Total number of retries if BrokenPipeError/IOError is raised.
+         delay (int): Number of seconds to wait between consecutive retries.
+    """
+
+    @wraps(func)
+    def wrapper(self, *args, **kwargs):
+        _tries, _delay = tries, delay
+        while _tries:
+            try:
+                return func(self, *args, **kwargs)
+            except (BrokenPipeError, IOError) as e:
+                _tries -= 1
+                if not _tries:
+                    raise
+
+                logging.warning(
+                    'Caught {}. Retrying in {} seconds...'.format(
+                        e._class__.__name__, _delay
+                    )
+                )
+
+                time.sleep(_delay)
+                # access _build_client method and rebuild Http Client
+                self._build_client()
+
+    return wrapper
+
+
 class MLEngineClient:
     """ Client for calling MLEngine APIs.
     """
+
     def __init__(self):
+        self._build_client()
+
+    def _build_client(self):
         self._ml_client = discovery.build('ml', 'v1', cache_discovery=False)
 
+    @_retry
     def create_job(self, project_id, job):
         """Create a new job.
 
@@ -40,6 +82,7 @@ def create_job(self, project_id, job):
             body = job
         ).execute()
 
+    @_retry
     def cancel_job(self, project_id, job_id):
         """Cancel the specified job.
 
@@ -55,6 +98,7 @@ def cancel_job(self, project_id, job_id):
             },
         ).execute()
 
+    @_retry
     def get_job(self, project_id, job_id):
         """Gets the job by ID.
 
@@ -68,6 +112,7 @@ def get_job(self, project_id, job_id):
         return self._ml_client.projects().jobs().get(
             name=job_name).execute()
 
+    @_retry
     def create_model(self, project_id, model):
         """Creates a new model.
 
@@ -82,6 +127,7 @@ def create_model(self, project_id, model):
             body = model
         ).execute()
 
+    @_retry
     def get_model(self, model_name):
         """Gets a model.
 
@@ -94,6 +140,7 @@ def get_model(self, model_name):
             name = model_name
         ).execute()
 
+    @_retry
     def create_version(self, model_name, version):
         """Creates a new version.
 
@@ -109,6 +156,7 @@ def create_version(self, model_name, version):
             body = version
         ).execute()
 
+    @_retry
     def get_version(self, version_name):
         """Gets a version.
 
@@ -127,6 +175,7 @@ def get_version(self, version_name):
                 return None
             raise
 
+    @_retry
     def delete_version(self, version_name):
         """Deletes a version.
 
@@ -146,11 +195,13 @@ def delete_version(self, version_name):
                 return None
             raise
 
+    @_retry
     def set_default_version(self, version_name):
         return self._ml_client.projects().models().versions().setDefault(
             name = version_name
         ).execute()
 
+    @_retry
     def get_operation(self, operation_name):
         """Gets an operation.
 
@@ -178,6 +229,7 @@ def wait_for_operation_done(self, operation_name, wait_interval):
         return wait_operation_done(
             lambda: self.get_operation(operation_name), wait_interval)
 
+    @_retry
     def cancel_operation(self, operation_name):
         """Cancels an operation.
 
diff --git a/components/gcp/container/component_sdk/python/setup.py b/components/gcp/container/component_sdk/python/setup.py
index 7e8df9c7af..ff0f851cc8 100644
--- a/components/gcp/container/component_sdk/python/setup.py
+++ b/components/gcp/container/component_sdk/python/setup.py
@@ -15,7 +15,7 @@
 from setuptools import setup
 
 PACKAGE_NAME = 'kfp-component'
-VERSION = '1.5.0-rc.2'
+VERSION = '1.5.0'
 
 setup(
     name=PACKAGE_NAME,
diff --git a/components/gcp/dataflow/launch_python/README.md b/components/gcp/dataflow/launch_python/README.md
index eec9a5856d..c05b47173f 100644
--- a/components/gcp/dataflow/launch_python/README.md
+++ b/components/gcp/dataflow/launch_python/README.md
@@ -90,7 +90,7 @@ The steps to use the component in a pipeline are:
     ```python
     import kfp.components as comp
 
-    dataflow_python_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataflow/launch_python/component.yaml')
+    dataflow_python_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataflow/launch_python/component.yaml')
     help(dataflow_python_op)
     ```
 
diff --git a/components/gcp/dataflow/launch_python/component.yaml b/components/gcp/dataflow/launch_python/component.yaml
index 612805a5ba..9011efa046 100644
--- a/components/gcp/dataflow/launch_python/component.yaml
+++ b/components/gcp/dataflow/launch_python/component.yaml
@@ -56,7 +56,7 @@ outputs:
     type: UI metadata
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path, {outputPath: MLPipeline UI metadata},
       kfp_component.google.dataflow, launch_python,
diff --git a/components/gcp/dataflow/launch_python/sample.ipynb b/components/gcp/dataflow/launch_python/sample.ipynb
index b1fdb994e5..79fbc91df3 100644
--- a/components/gcp/dataflow/launch_python/sample.ipynb
+++ b/components/gcp/dataflow/launch_python/sample.ipynb
@@ -92,7 +92,7 @@
     "import kfp.components as comp\n",
     "\n",
     "dataflow_python_op = comp.load_component_from_url(\n",
-    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataflow/launch_python/component.yaml')\n",
+    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataflow/launch_python/component.yaml')\n",
     "help(dataflow_python_op)"
    ]
   },
diff --git a/components/gcp/dataflow/launch_template/README.md b/components/gcp/dataflow/launch_template/README.md
index 9b2466e3ef..260a2bebc7 100644
--- a/components/gcp/dataflow/launch_template/README.md
+++ b/components/gcp/dataflow/launch_template/README.md
@@ -63,7 +63,7 @@ Follow these steps to use the component in a pipeline:
 import kfp.components as comp
 
 dataflow_template_op = comp.load_component_from_url(
-    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataflow/launch_template/component.yaml')
+    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataflow/launch_template/component.yaml')
 help(dataflow_template_op)
 ```
 
diff --git a/components/gcp/dataflow/launch_template/component.yaml b/components/gcp/dataflow/launch_template/component.yaml
index 80b828e563..d62c2ad0c4 100644
--- a/components/gcp/dataflow/launch_template/component.yaml
+++ b/components/gcp/dataflow/launch_template/component.yaml
@@ -63,7 +63,7 @@ outputs:
     type: UI metadata
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path, {outputPath: MLPipeline UI metadata},
       kfp_component.google.dataflow, launch_template,
diff --git a/components/gcp/dataflow/launch_template/sample.ipynb b/components/gcp/dataflow/launch_template/sample.ipynb
index e24e635ef5..247af4b841 100644
--- a/components/gcp/dataflow/launch_template/sample.ipynb
+++ b/components/gcp/dataflow/launch_template/sample.ipynb
@@ -81,7 +81,7 @@
     "import kfp.components as comp\n",
     "\n",
     "dataflow_template_op = comp.load_component_from_url(\n",
-    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataflow/launch_template/component.yaml')\n",
+    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataflow/launch_template/component.yaml')\n",
     "help(dataflow_template_op)"
    ]
   },
diff --git a/components/gcp/dataproc/create_cluster/README.md b/components/gcp/dataproc/create_cluster/README.md
index 51f925ee10..3c0ba723dc 100644
--- a/components/gcp/dataproc/create_cluster/README.md
+++ b/components/gcp/dataproc/create_cluster/README.md
@@ -87,7 +87,7 @@ Follow these steps to use the component in a pipeline:
     ```python
     import kfp.components as comp
 
-    dataproc_create_cluster_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/create_cluster/component.yaml')
+    dataproc_create_cluster_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/create_cluster/component.yaml')
     help(dataproc_create_cluster_op)
     ```
 
diff --git a/components/gcp/dataproc/create_cluster/component.yaml b/components/gcp/dataproc/create_cluster/component.yaml
index 1b9f02a326..5a9797fc99 100644
--- a/components/gcp/dataproc/create_cluster/component.yaml
+++ b/components/gcp/dataproc/create_cluster/component.yaml
@@ -70,7 +70,7 @@ outputs:
     type: UI metadata
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path, {outputPath: MLPipeline UI metadata},
       kfp_component.google.dataproc, create_cluster,
diff --git a/components/gcp/dataproc/create_cluster/sample.ipynb b/components/gcp/dataproc/create_cluster/sample.ipynb
index cf7c04d30b..0e067ce78a 100644
--- a/components/gcp/dataproc/create_cluster/sample.ipynb
+++ b/components/gcp/dataproc/create_cluster/sample.ipynb
@@ -87,7 +87,7 @@
     "import kfp.components as comp\n",
     "\n",
     "dataproc_create_cluster_op = comp.load_component_from_url(\n",
-    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/create_cluster/component.yaml')\n",
+    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/create_cluster/component.yaml')\n",
     "help(dataproc_create_cluster_op)"
    ]
   },
diff --git a/components/gcp/dataproc/delete_cluster/README.md b/components/gcp/dataproc/delete_cluster/README.md
index 0041f84789..bf48c59f96 100644
--- a/components/gcp/dataproc/delete_cluster/README.md
+++ b/components/gcp/dataproc/delete_cluster/README.md
@@ -65,7 +65,7 @@ Follow these steps to use the component in a pipeline:
     ```python
     import kfp.components as comp
 
-    dataproc_delete_cluster_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/delete_cluster/component.yaml')
+    dataproc_delete_cluster_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/delete_cluster/component.yaml')
     help(dataproc_delete_cluster_op)
     ```
 
diff --git a/components/gcp/dataproc/delete_cluster/component.yaml b/components/gcp/dataproc/delete_cluster/component.yaml
index 975a4ce3d7..dd548be93c 100644
--- a/components/gcp/dataproc/delete_cluster/component.yaml
+++ b/components/gcp/dataproc/delete_cluster/component.yaml
@@ -36,7 +36,7 @@ inputs:
     type: Integer
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       kfp_component.google.dataproc, delete_cluster,
       --project_id, {inputValue: project_id},
diff --git a/components/gcp/dataproc/delete_cluster/sample.ipynb b/components/gcp/dataproc/delete_cluster/sample.ipynb
index 2287c6e2ca..ddc1119d7a 100644
--- a/components/gcp/dataproc/delete_cluster/sample.ipynb
+++ b/components/gcp/dataproc/delete_cluster/sample.ipynb
@@ -70,7 +70,7 @@
     "import kfp.components as comp\n",
     "\n",
     "dataproc_delete_cluster_op = comp.load_component_from_url(\n",
-    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/delete_cluster/component.yaml')\n",
+    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/delete_cluster/component.yaml')\n",
     "help(dataproc_delete_cluster_op)"
    ]
   },
diff --git a/components/gcp/dataproc/submit_hadoop_job/README.md b/components/gcp/dataproc/submit_hadoop_job/README.md
index 44ea59dc57..a50ec1d089 100644
--- a/components/gcp/dataproc/submit_hadoop_job/README.md
+++ b/components/gcp/dataproc/submit_hadoop_job/README.md
@@ -82,7 +82,7 @@ Follow these steps to use the component in a pipeline:
     ```python
     import kfp.components as comp
 
-    dataproc_submit_hadoop_job_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_hadoop_job/component.yaml')
+    dataproc_submit_hadoop_job_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_hadoop_job/component.yaml')
     help(dataproc_submit_hadoop_job_op)
     ```
 
diff --git a/components/gcp/dataproc/submit_hadoop_job/component.yaml b/components/gcp/dataproc/submit_hadoop_job/component.yaml
index 5ede911124..3d85e85089 100644
--- a/components/gcp/dataproc/submit_hadoop_job/component.yaml
+++ b/components/gcp/dataproc/submit_hadoop_job/component.yaml
@@ -80,7 +80,7 @@ outputs:
     type: UI metadata
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path, {outputPath: MLPipeline UI metadata},
       kfp_component.google.dataproc, submit_hadoop_job,
diff --git a/components/gcp/dataproc/submit_hadoop_job/sample.ipynb b/components/gcp/dataproc/submit_hadoop_job/sample.ipynb
index ba690a943a..a0a4b098da 100644
--- a/components/gcp/dataproc/submit_hadoop_job/sample.ipynb
+++ b/components/gcp/dataproc/submit_hadoop_job/sample.ipynb
@@ -85,7 +85,7 @@
     "import kfp.components as comp\n",
     "\n",
     "dataproc_submit_hadoop_job_op = comp.load_component_from_url(\n",
-    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_hadoop_job/component.yaml')\n",
+    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_hadoop_job/component.yaml')\n",
     "help(dataproc_submit_hadoop_job_op)"
    ]
   },
diff --git a/components/gcp/dataproc/submit_hive_job/README.md b/components/gcp/dataproc/submit_hive_job/README.md
index ef77fa2e95..c8860662ff 100644
--- a/components/gcp/dataproc/submit_hive_job/README.md
+++ b/components/gcp/dataproc/submit_hive_job/README.md
@@ -72,7 +72,7 @@ Follow these steps to use the component in a pipeline:
     ```python
     import kfp.components as comp
 
-    dataproc_submit_hive_job_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_hive_job/component.yaml')
+    dataproc_submit_hive_job_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_hive_job/component.yaml')
     help(dataproc_submit_hive_job_op)
     ```
 
diff --git a/components/gcp/dataproc/submit_hive_job/component.yaml b/components/gcp/dataproc/submit_hive_job/component.yaml
index 1e4dc656bb..75fe7b133f 100644
--- a/components/gcp/dataproc/submit_hive_job/component.yaml
+++ b/components/gcp/dataproc/submit_hive_job/component.yaml
@@ -75,7 +75,7 @@ outputs:
     type: UI metadata
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path, {outputPath: MLPipeline UI metadata},
       kfp_component.google.dataproc, submit_hive_job,
diff --git a/components/gcp/dataproc/submit_hive_job/sample.ipynb b/components/gcp/dataproc/submit_hive_job/sample.ipynb
index aedeaa2b6d..ac2e9e71d9 100644
--- a/components/gcp/dataproc/submit_hive_job/sample.ipynb
+++ b/components/gcp/dataproc/submit_hive_job/sample.ipynb
@@ -76,7 +76,7 @@
     "import kfp.components as comp\n",
     "\n",
     "dataproc_submit_hive_job_op = comp.load_component_from_url(\n",
-    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_hive_job/component.yaml')\n",
+    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_hive_job/component.yaml')\n",
     "help(dataproc_submit_hive_job_op)"
    ]
   },
diff --git a/components/gcp/dataproc/submit_pig_job/README.md b/components/gcp/dataproc/submit_pig_job/README.md
index 67b6dac306..573f60b62c 100644
--- a/components/gcp/dataproc/submit_pig_job/README.md
+++ b/components/gcp/dataproc/submit_pig_job/README.md
@@ -81,7 +81,7 @@ Follow these steps to use the component in a pipeline:
     ```python
     import kfp.components as comp
 
-    dataproc_submit_pig_job_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_pig_job/component.yaml')
+    dataproc_submit_pig_job_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_pig_job/component.yaml')
     help(dataproc_submit_pig_job_op)
     ```
 
diff --git a/components/gcp/dataproc/submit_pig_job/component.yaml b/components/gcp/dataproc/submit_pig_job/component.yaml
index 30b55e8ea7..07cca0d7b5 100644
--- a/components/gcp/dataproc/submit_pig_job/component.yaml
+++ b/components/gcp/dataproc/submit_pig_job/component.yaml
@@ -75,7 +75,7 @@ outputs:
     type: UI metadata
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path, {outputPath: MLPipeline UI metadata},
       kfp_component.google.dataproc, submit_pig_job,
diff --git a/components/gcp/dataproc/submit_pig_job/sample.ipynb b/components/gcp/dataproc/submit_pig_job/sample.ipynb
index 68ef0f2fad..c662ea6cf5 100644
--- a/components/gcp/dataproc/submit_pig_job/sample.ipynb
+++ b/components/gcp/dataproc/submit_pig_job/sample.ipynb
@@ -79,7 +79,7 @@
     "import kfp.components as comp\n",
     "\n",
     "dataproc_submit_pig_job_op = comp.load_component_from_url(\n",
-    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_pig_job/component.yaml')\n",
+    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_pig_job/component.yaml')\n",
     "help(dataproc_submit_pig_job_op)"
    ]
   },
diff --git a/components/gcp/dataproc/submit_pyspark_job/README.md b/components/gcp/dataproc/submit_pyspark_job/README.md
index fc8cb0ff76..507f432972 100644
--- a/components/gcp/dataproc/submit_pyspark_job/README.md
+++ b/components/gcp/dataproc/submit_pyspark_job/README.md
@@ -78,7 +78,7 @@ Follow these steps to use the component in a pipeline:
     ```python
     import kfp.components as comp
 
-    dataproc_submit_pyspark_job_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_pyspark_job/component.yaml')
+    dataproc_submit_pyspark_job_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_pyspark_job/component.yaml')
     help(dataproc_submit_pyspark_job_op)
     ```
 
diff --git a/components/gcp/dataproc/submit_pyspark_job/component.yaml b/components/gcp/dataproc/submit_pyspark_job/component.yaml
index 6551d4c086..9b44543d3e 100644
--- a/components/gcp/dataproc/submit_pyspark_job/component.yaml
+++ b/components/gcp/dataproc/submit_pyspark_job/component.yaml
@@ -69,7 +69,7 @@ outputs:
     type: UI metadata
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path, {outputPath: MLPipeline UI metadata},
       kfp_component.google.dataproc, submit_pyspark_job,
diff --git a/components/gcp/dataproc/submit_pyspark_job/sample.ipynb b/components/gcp/dataproc/submit_pyspark_job/sample.ipynb
index aec36a1c74..d5f9172872 100644
--- a/components/gcp/dataproc/submit_pyspark_job/sample.ipynb
+++ b/components/gcp/dataproc/submit_pyspark_job/sample.ipynb
@@ -81,7 +81,7 @@
     "import kfp.components as comp\n",
     "\n",
     "dataproc_submit_pyspark_job_op = comp.load_component_from_url(\n",
-    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_pyspark_job/component.yaml')\n",
+    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_pyspark_job/component.yaml')\n",
     "help(dataproc_submit_pyspark_job_op)"
    ]
   },
diff --git a/components/gcp/dataproc/submit_spark_job/README.md b/components/gcp/dataproc/submit_spark_job/README.md
index 082d882b03..3b3ee2e42c 100644
--- a/components/gcp/dataproc/submit_spark_job/README.md
+++ b/components/gcp/dataproc/submit_spark_job/README.md
@@ -94,7 +94,7 @@ Follow these steps to use the component in a pipeline:
     import kfp.components as comp
 
     dataproc_submit_spark_job_op = comp.load_component_from_url(
-        'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_spark_job/component.yaml')
+        'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_spark_job/component.yaml')
     help(dataproc_submit_spark_job_op)
     ```
 
diff --git a/components/gcp/dataproc/submit_spark_job/component.yaml b/components/gcp/dataproc/submit_spark_job/component.yaml
index 6f72883464..c7403f4f2e 100644
--- a/components/gcp/dataproc/submit_spark_job/component.yaml
+++ b/components/gcp/dataproc/submit_spark_job/component.yaml
@@ -76,7 +76,7 @@ outputs:
     type: UI metadata
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path, {outputPath: MLPipeline UI metadata},
       kfp_component.google.dataproc, submit_spark_job,
diff --git a/components/gcp/dataproc/submit_spark_job/sample.ipynb b/components/gcp/dataproc/submit_spark_job/sample.ipynb
index 4f1dbb835c..50ff16ab34 100644
--- a/components/gcp/dataproc/submit_spark_job/sample.ipynb
+++ b/components/gcp/dataproc/submit_spark_job/sample.ipynb
@@ -92,7 +92,7 @@
     "import kfp.components as comp\n",
     "\n",
     "dataproc_submit_spark_job_op = comp.load_component_from_url(\n",
-    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_spark_job/component.yaml')\n",
+    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_spark_job/component.yaml')\n",
     "help(dataproc_submit_spark_job_op)"
    ]
   },
diff --git a/components/gcp/dataproc/submit_sparksql_job/README.md b/components/gcp/dataproc/submit_sparksql_job/README.md
index 8ac4f8fe29..b121acb02f 100644
--- a/components/gcp/dataproc/submit_sparksql_job/README.md
+++ b/components/gcp/dataproc/submit_sparksql_job/README.md
@@ -73,7 +73,7 @@ Follow these steps to use the component in a pipeline:
     ```python
     import kfp.components as comp
 
-    dataproc_submit_sparksql_job_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_sparksql_job/component.yaml')
+    dataproc_submit_sparksql_job_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_sparksql_job/component.yaml')
     help(dataproc_submit_sparksql_job_op)
     ```
 
diff --git a/components/gcp/dataproc/submit_sparksql_job/component.yaml b/components/gcp/dataproc/submit_sparksql_job/component.yaml
index 6bd0189276..a84c138508 100644
--- a/components/gcp/dataproc/submit_sparksql_job/component.yaml
+++ b/components/gcp/dataproc/submit_sparksql_job/component.yaml
@@ -75,7 +75,7 @@ outputs:
     type: UI metadata
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path, {outputPath: MLPipeline UI metadata},
       kfp_component.google.dataproc, submit_sparksql_job,
diff --git a/components/gcp/dataproc/submit_sparksql_job/sample.ipynb b/components/gcp/dataproc/submit_sparksql_job/sample.ipynb
index afaa625d87..22c1f88d57 100644
--- a/components/gcp/dataproc/submit_sparksql_job/sample.ipynb
+++ b/components/gcp/dataproc/submit_sparksql_job/sample.ipynb
@@ -77,7 +77,7 @@
     "import kfp.components as comp\n",
     "\n",
     "dataproc_submit_sparksql_job_op = comp.load_component_from_url(\n",
-    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/dataproc/submit_sparksql_job/component.yaml')\n",
+    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/dataproc/submit_sparksql_job/component.yaml')\n",
     "help(dataproc_submit_sparksql_job_op)"
    ]
   },
diff --git a/components/gcp/ml_engine/batch_predict/README.md b/components/gcp/ml_engine/batch_predict/README.md
index a1ade001bd..7092b4311b 100644
--- a/components/gcp/ml_engine/batch_predict/README.md
+++ b/components/gcp/ml_engine/batch_predict/README.md
@@ -86,7 +86,7 @@ Follow these steps to use the component in a pipeline:
 import kfp.components as comp
 
 mlengine_batch_predict_op = comp.load_component_from_url(
-    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/ml_engine/batch_predict/component.yaml')
+    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/ml_engine/batch_predict/component.yaml')
 help(mlengine_batch_predict_op)
 ```
 
diff --git a/components/gcp/ml_engine/batch_predict/component.yaml b/components/gcp/ml_engine/batch_predict/component.yaml
index f148613dd2..6f669d89ab 100644
--- a/components/gcp/ml_engine/batch_predict/component.yaml
+++ b/components/gcp/ml_engine/batch_predict/component.yaml
@@ -69,7 +69,7 @@ outputs:
     type: UI metadata
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path, {outputPath: MLPipeline UI metadata},
       kfp_component.google.ml_engine, batch_predict,
diff --git a/components/gcp/ml_engine/batch_predict/sample.ipynb b/components/gcp/ml_engine/batch_predict/sample.ipynb
index 7f932fa395..c465d8e85d 100644
--- a/components/gcp/ml_engine/batch_predict/sample.ipynb
+++ b/components/gcp/ml_engine/batch_predict/sample.ipynb
@@ -105,7 +105,7 @@
     "import kfp.components as comp\n",
     "\n",
     "mlengine_batch_predict_op = comp.load_component_from_url(\n",
-    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/ml_engine/batch_predict/component.yaml')\n",
+    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/ml_engine/batch_predict/component.yaml')\n",
     "help(mlengine_batch_predict_op)"
    ]
   },
diff --git a/components/gcp/ml_engine/deploy/README.md b/components/gcp/ml_engine/deploy/README.md
index cb3a4cd075..9b6f3d87e0 100644
--- a/components/gcp/ml_engine/deploy/README.md
+++ b/components/gcp/ml_engine/deploy/README.md
@@ -103,7 +103,7 @@ Follow these steps to use the component in a pipeline:
 import kfp.components as comp
 
 mlengine_deploy_op = comp.load_component_from_url(
-    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/ml_engine/deploy/component.yaml')
+    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/ml_engine/deploy/component.yaml')
 help(mlengine_deploy_op)
 ```
 
diff --git a/components/gcp/ml_engine/deploy/component.yaml b/components/gcp/ml_engine/deploy/component.yaml
index 1a1c2d83e8..63d91dee9b 100644
--- a/components/gcp/ml_engine/deploy/component.yaml
+++ b/components/gcp/ml_engine/deploy/component.yaml
@@ -95,7 +95,7 @@ outputs:
     type: UI metadata
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path, {outputPath: MLPipeline UI metadata},
       kfp_component.google.ml_engine, deploy,
diff --git a/components/gcp/ml_engine/deploy/sample.ipynb b/components/gcp/ml_engine/deploy/sample.ipynb
index 2583b2d55e..8429a376b8 100644
--- a/components/gcp/ml_engine/deploy/sample.ipynb
+++ b/components/gcp/ml_engine/deploy/sample.ipynb
@@ -120,7 +120,7 @@
     "import kfp.components as comp\n",
     "\n",
     "mlengine_deploy_op = comp.load_component_from_url(\n",
-    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/ml_engine/deploy/component.yaml')\n",
+    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/ml_engine/deploy/component.yaml')\n",
     "help(mlengine_deploy_op)"
    ]
   },
diff --git a/components/gcp/ml_engine/train/README.md b/components/gcp/ml_engine/train/README.md
index 5acb55a7d9..1eca0f56df 100644
--- a/components/gcp/ml_engine/train/README.md
+++ b/components/gcp/ml_engine/train/README.md
@@ -99,7 +99,7 @@ The steps to use the component in a pipeline are:
     ```python
     import kfp.components as comp
 
-    mlengine_train_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/ml_engine/train/component.yaml')
+    mlengine_train_op = comp.load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/ml_engine/train/component.yaml')
     help(mlengine_train_op)
     ```
 ### Sample
diff --git a/components/gcp/ml_engine/train/component.yaml b/components/gcp/ml_engine/train/component.yaml
index 6426d07094..3de64cf3b4 100644
--- a/components/gcp/ml_engine/train/component.yaml
+++ b/components/gcp/ml_engine/train/component.yaml
@@ -109,7 +109,7 @@ outputs:
     type: UI metadata
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-gcp:1.5.0
     args: [
       --ui_metadata_path, {outputPath: MLPipeline UI metadata},
       kfp_component.google.ml_engine, train,
diff --git a/components/gcp/ml_engine/train/sample.ipynb b/components/gcp/ml_engine/train/sample.ipynb
index 393b5adebf..2beaef15aa 100644
--- a/components/gcp/ml_engine/train/sample.ipynb
+++ b/components/gcp/ml_engine/train/sample.ipynb
@@ -99,7 +99,7 @@
     "import kfp.components as comp\n",
     "\n",
     "mlengine_train_op = comp.load_component_from_url(\n",
-    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0-rc.2/components/gcp/ml_engine/train/component.yaml')\n",
+    "    'https://raw.githubusercontent.com/kubeflow/pipelines/1.5.0/components/gcp/ml_engine/train/component.yaml')\n",
     "help(mlengine_train_op)"
    ]
   },
diff --git a/components/google-cloud/LICENSE b/components/google-cloud/LICENSE
new file mode 100644
index 0000000000..7a4a3ea242
--- /dev/null
+++ b/components/google-cloud/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
\ No newline at end of file
diff --git a/components/google-cloud/README.md b/components/google-cloud/README.md
new file mode 100644
index 0000000000..5b49eb68eb
--- /dev/null
+++ b/components/google-cloud/README.md
@@ -0,0 +1,3 @@
+# Google Cloud Components
+
+Note, this SDK is in early prototyping state and it is not ready for consumption.
diff --git a/components/google-cloud/container/aiplatform/Dockerfile b/components/google-cloud/container/aiplatform/Dockerfile
new file mode 100644
index 0000000000..ae29e881cc
--- /dev/null
+++ b/components/google-cloud/container/aiplatform/Dockerfile
@@ -0,0 +1,31 @@
+# Copyright 2021 Google LLC. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Base image to use for this docker
+FROM gcr.io/google-appengine/python:latest
+
+WORKDIR /root
+
+# Upgrade pip to latest
+RUN pip3 install --upgrade pip
+
+# Installs additional packages
+RUN pip3 install git+https://github.com/googleapis/python-aiplatform@mb-release
+
+# Copies the trainer code to the docker image.
+# TODO() change from using PR @fcd24983168bca93d9e0c3ef91cafa46f3612977 version to master
+RUN pip3 install "git+https://github.com/kubeflow/pipelines.git@fcd24983168bca93d9e0c3ef91cafa46f3612977#egg=google-cloud-components&subdirectory=components/google-cloud"
+
+# Sets up the entry point to invoke the trainer.
+ENTRYPOINT ["python3","-m","google_cloud_components.mb_sdk_component.remote_runner"]
\ No newline at end of file
diff --git a/components/google-cloud/container/aiplatform/cloud_build.yaml b/components/google-cloud/container/aiplatform/cloud_build.yaml
new file mode 100644
index 0000000000..7f8e85b6da
--- /dev/null
+++ b/components/google-cloud/container/aiplatform/cloud_build.yaml
@@ -0,0 +1,4 @@
+steps:
+- name: 'gcr.io/cloud-builders/docker'
+  args: ['build', '-t', 'gcr.io/PROJECT_ID_TBD/aiplatform_component', '.']
+images: ['gcr.io/PROJECT_ID_TBD/aiplatform_component']
diff --git a/components/google-cloud/dependencies.py b/components/google-cloud/dependencies.py
new file mode 100644
index 0000000000..f193e4a22b
--- /dev/null
+++ b/components/google-cloud/dependencies.py
@@ -0,0 +1,32 @@
+# Copyright 2021 Google LLC. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Setup configuration of  Google Cloud Components client side libraries."""
+
+def make_required_install_packages():
+  return [
+      "kfp>=1.4.0,<2.0.0",
+      "google-cloud-aiplatform>=0.5.0,<1.0.0"
+  ]
+
+
+def make_required_test_packages():
+  return make_required_install_packages() + [
+      "mock>=4.0.0",
+      "flake8>=3.0.0",
+      "pytest>=6.0.0",
+  ]
+
+
+def make_dependency_links():
+  return ["https://github.com/googleapis/python-aiplatform@dev"]
diff --git a/components/google-cloud/examples/README.md b/components/google-cloud/examples/README.md
new file mode 100644
index 0000000000..15b0535f34
--- /dev/null
+++ b/components/google-cloud/examples/README.md
@@ -0,0 +1,3 @@
+# Examples for Google Cloud Components SDK
+
+TBD
diff --git a/components/google-cloud/google_cloud_components/__init__.py b/components/google-cloud/google_cloud_components/__init__.py
new file mode 100644
index 0000000000..8d4f40633f
--- /dev/null
+++ b/components/google-cloud/google_cloud_components/__init__.py
@@ -0,0 +1,15 @@
+# Copyright 2021 Google LLC. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Google Cloud Components root."""
+from google_cloud_components import aiplatform
diff --git a/components/google-cloud/google_cloud_components/aiplatform/__init__.py b/components/google-cloud/google_cloud_components/aiplatform/__init__.py
new file mode 100644
index 0000000000..f1cee9b3f6
--- /dev/null
+++ b/components/google-cloud/google_cloud_components/aiplatform/__init__.py
@@ -0,0 +1,30 @@
+# Copyright 2021 Google LLC. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Core modules for AI Platform Components."""
+
+from google.cloud import aiplatform as aip
+from google_cloud_components.aiplatform import utils
+
+DatasetCreateOp = utils.convert_method_to_component(aip.Dataset.create)
+
+DatasetExportDataOp = utils.convert_method_to_component(
+    aip.Dataset.export_data, should_serialize_init=True)
+
+CustomContainerTrainingJobRunOp = utils.convert_method_to_component(
+    aip.CustomContainerTrainingJob.run, should_serialize_init=True)
+
+ModelDeployOp = utils.convert_method_to_component(
+    aip.Model.deploy, should_serialize_init=True)
+
+ModelUploadOp = utils.convert_method_to_component(aip.Model.upload)
diff --git a/components/google-cloud/google_cloud_components/aiplatform/remote_runner.py b/components/google-cloud/google_cloud_components/aiplatform/remote_runner.py
new file mode 100644
index 0000000000..5b3d1b5b06
--- /dev/null
+++ b/components/google-cloud/google_cloud_components/aiplatform/remote_runner.py
@@ -0,0 +1,154 @@
+# Copyright 2021 Google LLC. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Module for remote execution of AI Platform component."""
+
+import argparse
+import inspect
+import os
+from google.cloud import aiplatform
+from google.cloud import storage
+
+INIT_KEY = 'init'
+METHOD_KEY = 'method'
+
+
+# TODO() Add type-hinting the functions
+# TODO() Add explanation / exmaples and validation for kwargs
+def split_args(kwargs):
+  """Split args to match MB SDK input format for init, method and config."""
+  init_args = {}
+  method_args = {}
+  config_args = {}
+
+  for key, arg in kwargs.items():
+    if key.startswith(INIT_KEY):
+      init_args[key.split('.')[-1]] = arg
+    elif key.startswith(METHOD_KEY):
+      method_args[key.split('.')[-1]] = arg
+    else:
+      config_args[key.split('.')[-1]] = arg
+
+  return init_args, method_args, config_args
+
+# TODO() Add docstring and typ annotation.
+def write_to_gcs(project, gcs_uri, text):
+  """Helper method to write resouce names to gcs for downstream components."""
+
+  gcs_uri = gcs_uri[len('gs://'):]
+  gcs_bucket, gcs_blob = gcs_uri.split('/', 1)
+
+  with open('resource_name.txt', 'w') as f:
+    f.write(text)
+
+  client = storage.Client(project=project)
+  bucket = client.get_bucket(gcs_bucket)
+  blob = bucket.blob(os.path.join(gcs_blob, 'resource_name.txt'))
+  blob.upload_from_filename('resource_name.txt')
+
+
+def read_from_gcs(project, gcs_uri):
+  gcs_uri = gcs_uri[len('gs://'):]
+  gcs_bucket, gcs_blob = gcs_uri.split('/', 1)
+  client = storage.Client(project=project)
+  bucket = client.get_bucket(gcs_bucket)
+  blob = bucket.get_blob(os.path.join(gcs_blob, 'resource_name.txt'))
+  resource_name = blob.download_as_string().decode('utf-8')
+  return resource_name
+
+
+def resolve_project(serialized_args):
+  return serialized_args[INIT_KEY].get(
+      'project', serialized_args[METHOD_KEY].get('project'))
+
+
+def resolve_input_args(value, inpu_type, project):
+  """If this is an input from Pipelines, read it directly from gcs."""
+  if issubclass(inpu_type, aiplatform.base.AiPlatformResourceNoun):
+    if value.startswith('gs://'):  # not a resource noun:
+      value = read_from_gcs(project, value)
+  return value
+
+
+def resolve_init_args(key, value, project):
+  if key.endswith('_name'):
+    if value.startswith('gs://'):  # not a resource noun
+      value = read_from_gcs(project, value)
+  return value
+
+
+def runner(cls_name, method_name, resource_name_output_uri, kwargs):
+  """Main method for initializing and executing MBD SDK component."""
+  cls = getattr(aiplatform, cls_name)
+
+  init_args, method_args, _ = split_args(kwargs)
+
+  serialized_args = {INIT_KEY: init_args, METHOD_KEY: method_args}
+
+  project = resolve_project(serialized_args)
+
+  for key, param in inspect.signature(cls.__init__).parameters.items():
+    if key in serialized_args[INIT_KEY]:
+      serialized_args[INIT_KEY][key] = resolve_init_args(
+          key, serialized_args[INIT_KEY][key], project)
+
+  print(serialized_args[INIT_KEY])
+  obj = cls(**serialized_args[INIT_KEY]) if serialized_args[INIT_KEY] else cls
+
+  method = getattr(obj, method_name)
+
+  for key, param in inspect.signature(method).parameters.items():
+    if key in serialized_args[METHOD_KEY]:
+      type_args = getattr(param.annotation, '__args__', param.annotation)
+      cast = type_args[0] if isinstance(type_args, tuple) else type_args
+      serialized_args[METHOD_KEY][key] = resolve_input_args(
+          serialized_args[METHOD_KEY][key], cast, project)
+      serialized_args[METHOD_KEY][key] = cast(serialized_args[METHOD_KEY][key])
+
+  print(serialized_args[METHOD_KEY])
+  output = method(**serialized_args[METHOD_KEY])
+
+  if output:
+    write_to_gcs(project, resource_name_output_uri, output.resource_name)
+    return output
+
+
+def main():
+  parser = argparse.ArgumentParser()
+  parser.add_argument('--cls_name', type=str)
+  parser.add_argument('--method_name', type=str)
+  parser.add_argument('--resource_name_output_uri', type=str)
+
+  args, unknown_args = parser.parse_known_args()
+  kwargs = {}
+
+  key_value = None
+  for arg in unknown_args:
+    print(arg)
+    if '=' in arg:
+      key, value = arg[2:].split('=')
+      kwargs[key] = value
+    else:
+      if not key_value:
+        key_value = arg[2:]
+      else:
+        kwargs[key_value] = arg
+        key_value = None
+
+  print(
+      runner(args.cls_name, args.method_name, args.resource_name_output_uri,
+             kwargs))
+
+
+if __name__ == '__main__':
+  main()
diff --git a/components/google-cloud/google_cloud_components/aiplatform/utils.py b/components/google-cloud/google_cloud_components/aiplatform/utils.py
new file mode 100644
index 0000000000..8fa54cb41c
--- /dev/null
+++ b/components/google-cloud/google_cloud_components/aiplatform/utils.py
@@ -0,0 +1,96 @@
+# Copyright 2021 Google LLC. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Module for creating pipeline components based on AI Platform SDK."""
+
+import inspect
+import kfp
+from kfp import components
+
+INIT_KEY = "init"
+METHOD_KEY = "method"
+
+
+def convert_method_to_component(method, should_serialize_init=False):
+  """Creates a corresponding KFP Component for a given MBD SDK method."""
+  method_name = method.__name__
+
+  if inspect.ismethod(method):
+    cls_name = method.__self__.__name__
+    init_signature = inspect.signature(method.__self__.__init__)
+  else:
+    cls = getattr(
+        inspect.getmodule(method),
+        method.__qualname__.split(".<locals>", 1)[0].rsplit(".", 1)[0], None)
+    cls_name = cls.__name__
+    init_signature = inspect.signature(cls.__init__)
+
+  init_arg_names = set(
+      init_signature.parameters.keys()) if should_serialize_init else set([])
+
+  def make_args(sa):
+    additional_args = []
+    for key, args in sa.items():
+      for arg_key, value in args.items():
+        additional_args.append(f"    - --{key}.{arg_key}={value}")
+    return "\n".join(additional_args)
+
+  def component_yaml_generator(**kwargs):
+    """Function to create the actual component yaml for the input kwargs."""
+    inputs = ["inputs:"]
+    input_args = []
+    input_kwargs = {}
+
+    serialized_args = {"init": {}, "method": {}}
+
+    for key, value in kwargs.items():
+      prefix_key = "init" if key in init_arg_names else "method"
+      if isinstance(value, kfp.dsl.PipelineParam):
+        name = key
+        inputs.append("- {name: %s, type: Artifact}" % (name))
+        input_args.append("""
+    - --%s
+    - {inputUri: %s}
+""" % (f"{prefix_key}.{key}", key))
+        input_kwargs[key] = value
+      else:
+        serialized_args[prefix_key][key] = value
+
+    inputs = "\n".join(inputs) if len(inputs) > 1 else ""
+    input_args = "\n".join(input_args) if input_args else ""
+    component_text = """
+name: %s-%s
+%s
+outputs:
+- {name: resource_name_output, type: Artifact}
+implementation:
+  container:
+    image: gcr.io/sashaproject-1/AIPlatform_component:latest
+    command:
+    - python3
+    - remote_runner.py
+    - --cls_name=%s
+    - --method_name=%s
+%s
+    args:
+    - --resource_name_output_uri
+    - {outputUri: resource_name_output}
+%s
+""" % (cls_name, method_name, inputs, cls_name, method_name,
+       make_args(serialized_args), input_args)
+
+    print(component_text)
+
+    return components.load_component_from_text(component_text)(**input_kwargs)
+
+  return component_yaml_generator
diff --git a/components/google-cloud/google_cloud_components/version.py b/components/google-cloud/google_cloud_components/version.py
new file mode 100644
index 0000000000..e4fcda48d6
--- /dev/null
+++ b/components/google-cloud/google_cloud_components/version.py
@@ -0,0 +1,16 @@
+# Copyright 2021 Google LLC. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Contains the version string of Google Cloud Components."""
+
+__version__ = "0.0.1.dev"
diff --git a/components/google-cloud/setup.cfg b/components/google-cloud/setup.cfg
new file mode 100644
index 0000000000..224a77957f
--- /dev/null
+++ b/components/google-cloud/setup.cfg
@@ -0,0 +1,2 @@
+[metadata]
+description-file = README.md
\ No newline at end of file
diff --git a/components/google-cloud/setup.py b/components/google-cloud/setup.py
new file mode 100644
index 0000000000..f7e75c2ec1
--- /dev/null
+++ b/components/google-cloud/setup.py
@@ -0,0 +1,70 @@
+# Copyright 2021 Google LLC. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Setup script."""
+
+import importlib
+import os
+import types
+import dependencies
+
+from setuptools import find_packages
+from setuptools import setup
+
+relative_directory = os.path.relpath(os.path.dirname(os.path.abspath(__file__)))
+loader = importlib.machinery.SourceFileLoader(
+    fullname="version",
+    path=os.path.join(relative_directory, "google_cloud_components/version.py"),
+)
+version = types.ModuleType(loader.name)
+loader.exec_module(version)
+
+setup(
+    name="google-cloud-components",
+    version=version.__version__,
+    description="This SDK enables a set of First Party (Google owned) pipeline"
+    " components that allow users to take their experience from AI Platform"
+    " SDK and other Google Cloud services and create a corresponding pipeline"
+    " using KFP or Managed Pipelines.",
+    url="https://github.com/kubeflow/pipelines/tree/master/components/google-cloud",
+    author="The Google Cloud Components authors",
+    author_email="TBD",
+    license="Apache License 2.0",
+    extras_require={"tests": dependencies.make_required_test_packages()},
+    include_package_data=True,
+    install_requires=dependencies.make_required_install_packages(),
+    dependency_links=dependencies.make_dependency_links(),
+    classifiers=[
+        "Development Status :: 4 - Beta",
+        "Operating System :: Unix",
+        "Operating System :: MacOS",
+        "Intended Audience :: Developers",
+        "Intended Audience :: Education",
+        "Intended Audience :: Science/Research",
+        "License :: OSI Approved :: Apache Software License",
+        "Programming Language :: Python :: 3",
+        "Programming Language :: Python :: 3.6",
+        "Programming Language :: Python :: 3.7",
+        "Programming Language :: Python :: 3.8",
+        "Topic :: Scientific/Engineering",
+        "Topic :: Scientific/Engineering :: Artificial Intelligence",
+        "Topic :: Software Development",
+        "Topic :: Software Development :: Libraries",
+        "Topic :: Software Development :: Libraries :: Python Modules",
+    ],
+    package_dir={
+        "google_cloud_components":
+            os.path.join(relative_directory, "google_cloud_components")
+    },
+    packages=find_packages(where=relative_directory),
+)
diff --git a/components/google-cloud/tox.ini b/components/google-cloud/tox.ini
new file mode 100644
index 0000000000..19849d0854
--- /dev/null
+++ b/components/google-cloud/tox.ini
@@ -0,0 +1,26 @@
+[tox]
+envlist = py38
+skip_missing_interpreters = true
+
+[flake8]
+exclude =
+    .git,
+    .tox,
+    __pycache__,
+    AutoML,
+    container,
+    examples,
+    Optimizer,
+    storage,
+    build,
+    dist
+
+[testenv]
+usedevelop = True
+install_command = pip install -U {opts} {packages}
+extras = tests
+testpaths = tests
+commands =
+   flake8 --version
+   flake8 . --count --select=E9,F63,F7,F82,W --show-source --statistics
+   py.test -vvv -s {posargs}
diff --git a/components/great-expectations/validate/CSV/component.py b/components/great-expectations/validate/CSV/component.py
index 02e39dfa5d..8c16940605 100644
--- a/components/great-expectations/validate/CSV/component.py
+++ b/components/great-expectations/validate/CSV/component.py
@@ -6,16 +6,15 @@ def validate_csv_using_greatexpectations(
     expectation_suite_path: InputPath(),
     data_doc_path: OutputPath(),
 ):
-    """Validate a CSV dataset against a Great Expectations suite and create
-    Data Doc (a validation report). This component fails if validation is not
-    successful.
+    """Validate a CSV dataset against a Great Expectations suite and create Data Doc (a validation report).
+    This component fails if validation is not successful.
 
     Annotations:
         authors: Yaroslav Beshta <ybeshta@provectus.com>, Anton Kiselev <akiselev@provectus.com>
 
     Args:
         csv_path: Path to the CSV file with the dataset.
-        expectation_suite_path: Path to Great Expectations expectation suite (in JSON format)
+        expectation_suite_path: Path to Great Expectations expectation suite (in JSON format).
     """
     import json
     import os
@@ -42,7 +41,7 @@ def validate_csv_using_greatexpectations(
 
 
 if __name__ == '__main__':
-    calculate_regression_metrics_from_csv_op = create_component_from_func(
+    validate_csv_using_greatexpectations_op = create_component_from_func(
         validate_csv_using_greatexpectations,
         output_component_file='component.yaml',
         base_image='python:3.8',
diff --git a/components/great-expectations/validate/CSV/component.yaml b/components/great-expectations/validate/CSV/component.yaml
index 66d2a1be75..323be407d8 100644
--- a/components/great-expectations/validate/CSV/component.yaml
+++ b/components/great-expectations/validate/CSV/component.yaml
@@ -1,17 +1,10 @@
 name: Validate csv using greatexpectations
-description: |-
-  Validate a CSV dataset against a Great Expectations suite and create Data Doc (a vaidation report).
-      This component fails if validation is not successful.
-
-      Annotations:
-          authors: Yaroslav Beshta <ybeshta@provectus.com>, Anton Kiselev <akiselev@provectus.com>
-
-      Args:
-          csv_path: Path to the CSV file with the dataset.
-          expectation_suite_path: Path to Great Expectations expectation suite (in JSON format)
+description: Validate a CSV dataset against a Great Expectations suite and create
+  Data Doc (a validation report).
 inputs:
-- {name: csv}
-- {name: expectation_suite}
+- {name: csv, description: Path to the CSV file with the dataset.}
+- {name: expectation_suite, description: Path to Great Expectations expectation suite
+    (in JSON format).}
 outputs:
 - {name: data_doc}
 implementation:
@@ -24,9 +17,12 @@ implementation:
       'great-expectations==0.13.11' || PIP_DISABLE_PIP_VERSION_CHECK=1 python3 -m
       pip install --quiet --no-warn-script-location 'great-expectations==0.13.11'
       --user) && "$0" "$@"
-    - python3
-    - -u
-    - -c
+    - sh
+    - -ec
+    - |
+      program_path=$(mktemp)
+      printf "%s" "$0" > "$program_path"
+      python3 -u "$program_path" "$@"
     - |
       def _make_parent_dirs_and_return_path(file_path: str):
           import os
@@ -38,7 +34,7 @@ implementation:
           expectation_suite_path,
           data_doc_path,
       ):
-          """Validate a CSV dataset against a Great Expectations suite and create Data Doc (a vaidation report).
+          """Validate a CSV dataset against a Great Expectations suite and create Data Doc (a validation report).
           This component fails if validation is not successful.
 
           Annotations:
@@ -46,7 +42,7 @@ implementation:
 
           Args:
               csv_path: Path to the CSV file with the dataset.
-              expectation_suite_path: Path to Great Expectations expectation suite (in JSON format)
+              expectation_suite_path: Path to Great Expectations expectation suite (in JSON format).
           """
           import json
           import os
@@ -58,10 +54,7 @@ implementation:
 
           with open(expectation_suite_path, 'r') as json_file:
               expectation_suite = json.load(json_file)
-          df = ge.read_csv(
-              csv_path,
-              expectation_suite=expectation_suite
-          )
+          df = ge.read_csv(csv_path, expectation_suite=expectation_suite)
           result = df.validate()
 
           document_model = ValidationResultsPageRenderer().render(result)
@@ -75,7 +68,7 @@ implementation:
               sys.exit(1)
 
       import argparse
-      _parser = argparse.ArgumentParser(prog='Validate csv using greatexpectations', description='Validate a CSV dataset against a Great Expectations suite and create Data Doc (a vaidation report).\n    This component fails if validation is not successful.\n\n    Annotations:\n        authors: Yaroslav Beshta <ybeshta@provectus.com>, Anton Kiselev <akiselev@provectus.com>\n\n    Args:\n        csv_path: Path to the CSV file with the dataset.\n        expectation_suite_path: Path to Great Expectations expectation suite (in JSON format)')
+      _parser = argparse.ArgumentParser(prog='Validate csv using greatexpectations', description='Validate a CSV dataset against a Great Expectations suite and create Data Doc (a validation report).')
       _parser.add_argument("--csv", dest="csv_path", type=str, required=True, default=argparse.SUPPRESS)
       _parser.add_argument("--expectation-suite", dest="expectation_suite_path", type=str, required=True, default=argparse.SUPPRESS)
       _parser.add_argument("--data-doc", dest="data_doc_path", type=_make_parent_dirs_and_return_path, required=True, default=argparse.SUPPRESS)
diff --git a/components/kubeflow/deployer/component.yaml b/components/kubeflow/deployer/component.yaml
index d3df8de90c..0fc6229385 100644
--- a/components/kubeflow/deployer/component.yaml
+++ b/components/kubeflow/deployer/component.yaml
@@ -11,7 +11,7 @@ inputs:
 #  - {name: Endppoint URI, type: Serving URI,                      description: 'URI of the deployed prediction service..'}
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-kubeflow-deployer:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-kubeflow-deployer:1.5.0
     command: [/bin/deploy.sh]
     args: [
       --model-export-path,  {inputValue: Model dir},
diff --git a/components/kubeflow/dnntrainer/component.yaml b/components/kubeflow/dnntrainer/component.yaml
index b1666dc67a..baf0f156d5 100644
--- a/components/kubeflow/dnntrainer/component.yaml
+++ b/components/kubeflow/dnntrainer/component.yaml
@@ -16,7 +16,7 @@ outputs:
   - {name: MLPipeline UI metadata, type: UI metadata}
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-kubeflow-tf-trainer:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-kubeflow-tf-trainer:1.5.0
     command: [python2, -m, trainer.task]
     args: [
       --transformed-data-dir, {inputValue: Transformed data dir},
diff --git a/components/kubeflow/kfserving/README.md b/components/kubeflow/kfserving/README.md
index 09bcc9241f..dd9a9f3806 100644
--- a/components/kubeflow/kfserving/README.md
+++ b/components/kubeflow/kfserving/README.md
@@ -1,6 +1,11 @@
 # KFServing Component
 
-This is the Kubeflow Pipelines component for KFServing. This uses the [V1beta1 API](https://github.com/kubeflow/kfserving/blob/master/docs/apis/v1beta1/README.md).
+This is the Kubeflow Pipelines component for KFServing. This uses the [V1beta1 API](https://github.com/kubeflow/kfserving/blob/master/docs/apis/v1beta1/README.md),
+so your cluster must have a KFServing version >= v0.5.0 in order to use this.
+
+If you are using KFServing version prior to v0.5.0, an older deprecated version of the KFServing Pipelines component must be used
+and can be found at [this commit](https://github.com/kubeflow/pipelines/tree/65bed9b6d1d676ef2d541a970d3edc0aee12400d/components/kubeflow/kfserving).
+Sample usage of this component can be found [here](https://github.com/kubeflow/kfserving/blob/master/docs/samples/pipelines/kfs-pipeline-v1alpha2.ipynb).
 
 ## Usage
 
@@ -177,3 +182,4 @@ kfserving_op(
     inferenceservice_yaml=isvc_yaml
 )
 ```
+
diff --git a/components/kubeflow/kfserving/component.yaml b/components/kubeflow/kfserving/component.yaml
index 549755c4a9..8e89552e16 100644
--- a/components/kubeflow/kfserving/component.yaml
+++ b/components/kubeflow/kfserving/component.yaml
@@ -15,6 +15,8 @@ inputs:
   - {name: Watch Timeout,             type: String, default: '300',        description: "Timeout seconds for watching until InferenceService becomes ready."}
   - {name: Min Replicas,              type: String, default: '-1',         description: 'Minimum number of InferenceService replicas'}
   - {name: Max Replicas,              type: String, default: '-1',         description: 'Maximum number of InferenceService replicas'}
+  - {name: Request Timeout,           type: String, default: '60',         description: "Specifies the number of seconds to wait before timing out a request to the component."}
+
 outputs:
   - {name: InferenceService Status,   type: String,                        description: 'Status JSON output of InferenceService'}
 implementation:
@@ -37,5 +39,6 @@ implementation:
       --inferenceservice-yaml,  {inputValue: InferenceService YAML},
       --watch-timeout,          {inputValue: Watch Timeout},
       --min-replicas,           {inputValue: Min Replicas},
-      --max-replicas,           {inputValue: Max Replicas}
+      --max-replicas,           {inputValue: Max Replicas},
+      --request-timeout,        {inputValue: Request Timeout}
     ]
diff --git a/components/kubeflow/kfserving/src/kfservingdeployer.py b/components/kubeflow/kfserving/src/kfservingdeployer.py
index ca1d39c777..5b1ab5366b 100644
--- a/components/kubeflow/kfserving/src/kfservingdeployer.py
+++ b/components/kubeflow/kfserving/src/kfservingdeployer.py
@@ -51,7 +51,7 @@
 
 
 def create_predictor_spec(framework, storage_uri, canary_traffic_percent,
-                          service_account, min_replicas, max_replicas, containers):
+                          service_account, min_replicas, max_replicas, containers, request_timeout):
     """
     Create and return V1beta1PredictorSpec to be used in a V1beta1InferenceServiceSpec
     object.
@@ -68,9 +68,9 @@ def create_predictor_spec(framework, storage_uri, canary_traffic_percent,
                       else None
                      ),
         containers=(containers or None),
-        canary_traffic_percent=canary_traffic_percent
+        canary_traffic_percent=canary_traffic_percent,
+        timeout=request_timeout
     )
-
     # If the containers field was set, then this is custom model serving.
     if containers:
         return predictor_spec
@@ -180,8 +180,8 @@ def submit_api_request(kfs_client, action, name, isvc, namespace=None,
 
 def perform_action(action, model_name, model_uri, canary_traffic_percent, namespace,
                    framework, custom_model_spec, service_account, inferenceservice_yaml,
-                   autoscaling_target=0, enable_istio_sidecar=True, watch_timeout=300,
-                   min_replicas=0, max_replicas=0):
+                   request_timeout, autoscaling_target=0, enable_istio_sidecar=True,
+                   watch_timeout=300, min_replicas=0, max_replicas=0):
     """
     Perform the specified action. If the action is not 'delete' and `inferenceService_yaml`
     was provided, the dict representation of the YAML will be sent directly to the
@@ -225,7 +225,7 @@ def perform_action(action, model_name, model_uri, canary_traffic_percent, namesp
         # Build the V1beta1PredictorSpec.
         predictor_spec = create_predictor_spec(
             framework, model_uri, canary_traffic_percent, service_account,
-            min_replicas, max_replicas, containers
+            min_replicas, max_replicas, containers, request_timeout
         )
 
         kfsvc = create_inference_service(metadata, predictor_spec)
@@ -325,6 +325,10 @@ def main():
     parser.add_argument(
         "--max-replicas", type=str, help="Maximum number of replicas", default="-1"
     )
+    parser.add_argument("--request-timeout",
+                        type=str,
+                        help="Specifies the number of seconds to wait before timing out a request to the component.",
+                        default="60")
 
     args = parser.parse_args()
 
@@ -343,6 +347,7 @@ def main():
     watch_timeout = int(args.watch_timeout)
     min_replicas = int(args.min_replicas)
     max_replicas = int(args.max_replicas)
+    request_timeout = int(args.request_timeout)
 
     # Default the namespace.
     if not namespace:
@@ -376,6 +381,7 @@ def main():
         service_account=service_account,
         enable_istio_sidecar=enable_istio_sidecar,
         inferenceservice_yaml=inferenceservice_yaml,
+        request_timeout=request_timeout,
         watch_timeout=watch_timeout,
         min_replicas=min_replicas,
         max_replicas=max_replicas
@@ -404,6 +410,13 @@ def main():
             sys.exit(1)
 
     if output_path:
+        try:
+            # Remove some less needed fields to reduce output size.
+            del model_status['metadata']['managedFields']
+            del model_status['status']['conditions']
+        except KeyError:
+            pass
+
         if not os.path.exists(os.path.dirname(output_path)):
             os.makedirs(os.path.dirname(output_path))
         with open(output_path, "w") as report:
diff --git a/components/local/confusion_matrix/component.yaml b/components/local/confusion_matrix/component.yaml
index dd67eddbdf..f441bfdf69 100644
--- a/components/local/confusion_matrix/component.yaml
+++ b/components/local/confusion_matrix/component.yaml
@@ -9,7 +9,7 @@ outputs:
   - {name: MLPipeline Metrics,     type: Metrics}
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-local-confusion-matrix:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-local-confusion-matrix:1.5.0
     command: [python2, /ml/confusion_matrix.py]
     args: [
       --predictions, {inputValue: Predictions},
diff --git a/components/local/roc/component.yaml b/components/local/roc/component.yaml
index f061afac84..0c614cd190 100644
--- a/components/local/roc/component.yaml
+++ b/components/local/roc/component.yaml
@@ -11,7 +11,7 @@ outputs:
   - {name: MLPipeline Metrics,     type: Metrics}
 implementation:
   container:
-    image: gcr.io/ml-pipeline/ml-pipeline-local-confusion-matrix:1.5.0-rc.2
+    image: gcr.io/ml-pipeline/ml-pipeline-local-confusion-matrix:1.5.0
     command: [python2, /ml/roc.py]
     args: [
       --predictions,        {inputValue: Predictions dir},
diff --git a/manifests/gcp_marketplace/chart/kubeflow-pipelines/templates/application.yaml b/manifests/gcp_marketplace/chart/kubeflow-pipelines/templates/application.yaml
index aa6ad22b9a..bd4c2aaa28 100644
--- a/manifests/gcp_marketplace/chart/kubeflow-pipelines/templates/application.yaml
+++ b/manifests/gcp_marketplace/chart/kubeflow-pipelines/templates/application.yaml
@@ -12,7 +12,7 @@ metadata:
 spec:
   descriptor:
     type: Kubeflow Pipelines
-    version: 1.5.0-rc.2
+    version: 1.5.0
     description: |-
       Reusable end-to-end ML workflow
     maintainers:
diff --git a/manifests/gcp_marketplace/schema.yaml b/manifests/gcp_marketplace/schema.yaml
index 47538fbc93..4e3abf5e8b 100644
--- a/manifests/gcp_marketplace/schema.yaml
+++ b/manifests/gcp_marketplace/schema.yaml
@@ -1,9 +1,9 @@
 x-google-marketplace:
   schemaVersion: v2
   applicationApiVersion: v1beta1
-  publishedVersion: 1.5.0-rc.2
+  publishedVersion: 1.5.0
   publishedVersionMetadata:
-    releaseNote: Based on 1.5.0-rc.2 version.
+    releaseNote: Based on 1.5.0 version.
     releaseTypes:
       - Feature
     recommended: false
diff --git a/manifests/kustomize/base/cache-deployer/kustomization.yaml b/manifests/kustomize/base/cache-deployer/kustomization.yaml
index f86fcc0fd0..054b005706 100644
--- a/manifests/kustomize/base/cache-deployer/kustomization.yaml
+++ b/manifests/kustomize/base/cache-deployer/kustomization.yaml
@@ -10,4 +10,4 @@ commonLabels:
   app: cache-deployer
 images:
   - name: gcr.io/ml-pipeline/cache-deployer
-    newTag: 1.5.0-rc.2
+    newTag: 1.5.0
diff --git a/manifests/kustomize/base/cache/kustomization.yaml b/manifests/kustomize/base/cache/kustomization.yaml
index 323a3da5b3..ecaa5a919b 100644
--- a/manifests/kustomize/base/cache/kustomization.yaml
+++ b/manifests/kustomize/base/cache/kustomization.yaml
@@ -10,4 +10,4 @@ commonLabels:
   app: cache-server
 images:
   - name: gcr.io/ml-pipeline/cache-server
-    newTag: 1.5.0-rc.2
+    newTag: 1.5.0
diff --git a/manifests/kustomize/base/installs/generic/pipeline-install-config.yaml b/manifests/kustomize/base/installs/generic/pipeline-install-config.yaml
index b0b997cf9e..b565216b1f 100644
--- a/manifests/kustomize/base/installs/generic/pipeline-install-config.yaml
+++ b/manifests/kustomize/base/installs/generic/pipeline-install-config.yaml
@@ -4,7 +4,7 @@ metadata:
   name: pipeline-install-config
 data:
   appName: pipeline
-  appVersion: 1.5.0-rc.2
+  appVersion: 1.5.0
   dbHost: mysql
   dbPort: "3306"
   mlmdDb: metadb
diff --git a/manifests/kustomize/base/installs/multi-user/istio-authorization-config.yaml b/manifests/kustomize/base/installs/multi-user/istio-authorization-config.yaml
index a988072b4f..a9a45e5eb1 100644
--- a/manifests/kustomize/base/installs/multi-user/istio-authorization-config.yaml
+++ b/manifests/kustomize/base/installs/multi-user/istio-authorization-config.yaml
@@ -70,19 +70,6 @@ spec:
   rules:
   - {}
 
----
-apiVersion: security.istio.io/v1beta1
-kind: AuthorizationPolicy
-metadata:
-  name: metadata-grpc-service
-spec:
-  action: ALLOW
-  selector:
-    matchLabels:
-      component: metadata-grpc-server
-  rules:
-  - {}
-
 ---
 apiVersion: "networking.istio.io/v1alpha3"
 kind: DestinationRule
diff --git a/manifests/kustomize/base/installs/multi-user/virtual-service.yaml b/manifests/kustomize/base/installs/multi-user/virtual-service.yaml
index d82e06e29c..2b7991a9a0 100644
--- a/manifests/kustomize/base/installs/multi-user/virtual-service.yaml
+++ b/manifests/kustomize/base/installs/multi-user/virtual-service.yaml
@@ -19,27 +19,3 @@ spec:
         port:
           number: 80
     timeout: 300s
-
----
-
-apiVersion: networking.istio.io/v1alpha3
-kind: VirtualService
-metadata:
-  name: metadata-grpc
-  namespace: kubeflow
-spec:
-  gateways:
-  - kubeflow-gateway
-  hosts:
-  - '*'
-  http:
-  - match:
-    - uri:
-        prefix: /ml_metadata
-    rewrite:
-      uri: /ml_metadata
-    route:
-    - destination:
-        host: ml-pipeline-ui.$(kfp-namespace).svc.cluster.local
-        port:
-          number: 80
diff --git a/manifests/kustomize/base/metadata/base/kustomization.yaml b/manifests/kustomize/base/metadata/base/kustomization.yaml
index bd9dcd1620..70aed653b1 100644
--- a/manifests/kustomize/base/metadata/base/kustomization.yaml
+++ b/manifests/kustomize/base/metadata/base/kustomization.yaml
@@ -9,4 +9,4 @@ resources:
   - metadata-grpc-sa.yaml
 images:
   - name: gcr.io/ml-pipeline/metadata-envoy
-    newTag: 1.5.0-rc.2
+    newTag: 1.5.0
diff --git a/manifests/kustomize/base/metadata/options/istio/destination-rule.yaml b/manifests/kustomize/base/metadata/options/istio/destination-rule.yaml
new file mode 100644
index 0000000000..e2ce8ca972
--- /dev/null
+++ b/manifests/kustomize/base/metadata/options/istio/destination-rule.yaml
@@ -0,0 +1,9 @@
+apiVersion: networking.istio.io/v1alpha3
+kind: DestinationRule
+metadata:
+  name: metadata-grpc-service
+spec:
+  host: metadata-grpc-service.kubeflow.svc.cluster.local
+  trafficPolicy:
+    tls:
+      mode: ISTIO_MUTUAL
diff --git a/manifests/kustomize/base/metadata/options/istio/istio-authorization-policy.yaml b/manifests/kustomize/base/metadata/options/istio/istio-authorization-policy.yaml
new file mode 100644
index 0000000000..8f41789e8e
--- /dev/null
+++ b/manifests/kustomize/base/metadata/options/istio/istio-authorization-policy.yaml
@@ -0,0 +1,11 @@
+apiVersion: security.istio.io/v1beta1
+kind: AuthorizationPolicy
+metadata:
+  name: metadata-grpc-service
+spec:
+  action: ALLOW
+  selector:
+    matchLabels:
+      component: metadata-grpc-server
+  rules:
+  - {}
diff --git a/manifests/kustomize/base/metadata/options/istio/kustomization.yaml b/manifests/kustomize/base/metadata/options/istio/kustomization.yaml
new file mode 100644
index 0000000000..029a6937ca
--- /dev/null
+++ b/manifests/kustomize/base/metadata/options/istio/kustomization.yaml
@@ -0,0 +1,7 @@
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+resources:
+- istio-authorization-policy.yaml
+- destination-rule.yaml
+- virtual-service.yaml
diff --git a/manifests/kustomize/base/metadata/options/istio/virtual-service.yaml b/manifests/kustomize/base/metadata/options/istio/virtual-service.yaml
new file mode 100644
index 0000000000..01e000b65c
--- /dev/null
+++ b/manifests/kustomize/base/metadata/options/istio/virtual-service.yaml
@@ -0,0 +1,21 @@
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: metadata-grpc
+  namespace: kubeflow
+spec:
+  gateways:
+  - kubeflow-gateway
+  hosts:
+  - '*'
+  http:
+  - match:
+    - uri:
+        prefix: /ml_metadata
+    rewrite:
+      uri: /ml_metadata
+    route:
+    - destination:
+        host: metadata-envoy-service.kubeflow.svc.cluster.local
+        port:
+          number: 9090
diff --git a/manifests/kustomize/base/pipeline/kustomization.yaml b/manifests/kustomize/base/pipeline/kustomization.yaml
index d07d32938f..5a5042c116 100644
--- a/manifests/kustomize/base/pipeline/kustomization.yaml
+++ b/manifests/kustomize/base/pipeline/kustomization.yaml
@@ -54,9 +54,9 @@ images:
     newName: docker.io/aipipeline/frontend
     newTag: 0.8.0-rc0
   - name: gcr.io/ml-pipeline/viewer-crd-controller
-    newTag: 1.5.0-rc.2
+    newTag: 1.5.0
   - name: gcr.io/ml-pipeline/visualization-server
-    newTag: 1.5.0-rc.2
+    newTag: 1.5.0
   - name: gcr.io/ml-pipeline/metadata-writer
     newName: docker.io/aipipeline/metadata-writer
     newTag: 0.8.0-rc0
diff --git a/manifests/kustomize/base/pipeline/metadata-writer/kustomization.yaml b/manifests/kustomize/base/pipeline/metadata-writer/kustomization.yaml
index 478c1910c7..c9baea3db0 100644
--- a/manifests/kustomize/base/pipeline/metadata-writer/kustomization.yaml
+++ b/manifests/kustomize/base/pipeline/metadata-writer/kustomization.yaml
@@ -7,4 +7,4 @@ resources:
   - metadata-writer-sa.yaml
 images:
   - name: gcr.io/ml-pipeline/metadata-writer
-    newTag: 1.5.0-rc.2
+    newTag: 1.5.0
diff --git a/manifests/kustomize/env/gcp/inverse-proxy/kustomization.yaml b/manifests/kustomize/env/gcp/inverse-proxy/kustomization.yaml
index 8a369d191b..0d4b29ebc9 100644
--- a/manifests/kustomize/env/gcp/inverse-proxy/kustomization.yaml
+++ b/manifests/kustomize/env/gcp/inverse-proxy/kustomization.yaml
@@ -2,7 +2,7 @@ apiVersion: kustomize.config.k8s.io/v1beta1
 kind: Kustomization
 images:
   - name: gcr.io/ml-pipeline/inverse-proxy-agent
-    newTag: 1.5.0-rc.2
+    newTag: 1.5.0
 resources:
   - proxy-configmap.yaml
   - proxy-deployment.yaml
diff --git a/manifests/kustomize/env/plain-multi-user/kustomization.yaml b/manifests/kustomize/env/plain-multi-user/kustomization.yaml
index 5bdb25278d..7246bf673c 100644
--- a/manifests/kustomize/env/plain-multi-user/kustomization.yaml
+++ b/manifests/kustomize/env/plain-multi-user/kustomization.yaml
@@ -4,6 +4,7 @@ kind: Kustomization
 bases:
   - ../../base/installs/multi-user
   - ../../base/metadata/base
+  - ../../base/metadata/options/istio
   - ../../third-party/mysql/base
   - ../../third-party/mysql/options/istio
   - ../../third-party/minio/base
diff --git a/manifests/kustomize/third-party/minio/options/istio/istio-authorization-policy.yaml b/manifests/kustomize/third-party/minio/options/istio/istio-authorization-policy.yaml
index 4c2fdf708b..7247cd34f9 100644
--- a/manifests/kustomize/third-party/minio/options/istio/istio-authorization-policy.yaml
+++ b/manifests/kustomize/third-party/minio/options/istio/istio-authorization-policy.yaml
@@ -1,4 +1,3 @@
-
 apiVersion: security.istio.io/v1beta1
 kind: AuthorizationPolicy
 metadata:
diff --git a/sdk/python/README.md b/sdk/python/README.md
index 5aacaa1e65..67468d487f 100644
--- a/sdk/python/README.md
+++ b/sdk/python/README.md
@@ -108,7 +108,7 @@ the Tekton YAML instead of Argo YAML. Since the KFP SDK was not designed and imp
 _monkey-patching_ was used to replace non-class methods and functions at runtime.
 
 In order for the _monkey patch_ to work properly, the `kfp-tekton` compiler source code has to be aligned with a
-specific version of the `kfp` SDK compiler. As of now that version is [`1.5.0-rc.2`](https://github.com/kubeflow/pipelines/releases/tag/1.5.0-rc.2).
+specific version of the `kfp` SDK compiler. As of now that version is [`1.5.0`](https://github.com/kubeflow/pipelines/releases/tag/1.5.0).
 
 
 ## Adding New Code
diff --git a/sdk/python/kfp_tekton/__init__.py b/sdk/python/kfp_tekton/__init__.py
index 0cd2a29ba4..843687e209 100644
--- a/sdk/python/kfp_tekton/__init__.py
+++ b/sdk/python/kfp_tekton/__init__.py
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-__version__ = '0.8.0-rc.0'
+__version__ = '0.8.0'
 
 from ._client import TektonClient  # noqa F401
 from .k8s_client_helper import env_from_secret  # noqa F401
diff --git a/sdk/python/requirements.in b/sdk/python/requirements.in
index 639d774c53..9743334aeb 100644
--- a/sdk/python/requirements.in
+++ b/sdk/python/requirements.in
@@ -1,3 +1,3 @@
 # TODO
 #kfp==1.5.0
-git+https://github.com/kubeflow/pipelines.git@1.5.0-rc.2#egg=kfp&subdirectory=sdk/python
+git+https://github.com/kubeflow/pipelines.git@1.5.0#egg=kfp&subdirectory=sdk/python
diff --git a/sdk/python/requirements.txt b/sdk/python/requirements.txt
index c19d1d3da3..cfd4ee3dbe 100644
--- a/sdk/python/requirements.txt
+++ b/sdk/python/requirements.txt
@@ -5,7 +5,7 @@
 #    pip-compile --output-file=sdk/python/requirements.txt sdk/python/requirements.in
 #
 absl-py==0.11.0
-    # via -r kfp
+    # via kfp
 attrs==20.3.0
     # via jsonschema
 cachetools==4.2.1
@@ -34,6 +34,7 @@ google-api-core==1.26.0
 google-auth==1.27.0
     # via
     #   google-api-core
+    #   google-cloud-core
     #   google-cloud-storage
     #   kfp
     #   kubernetes
@@ -57,7 +58,7 @@ kfp-server-api==1.3.0
     # via kfp
 # kfp==1.5.0
     # TODO
-git+https://github.com/kubeflow/pipelines.git@1.5.0-rc.2#egg=kfp&subdirectory=sdk/python
+git+https://github.com/kubeflow/pipelines.git@1.5.0#egg=kfp&subdirectory=sdk/python
     # via -r sdk/python/requirements.in
 kubernetes==12.0.1
     # via kfp
diff --git a/sdk/python/setup.py b/sdk/python/setup.py
index a4c06d76b7..993529a457 100644
--- a/sdk/python/setup.py
+++ b/sdk/python/setup.py
@@ -20,14 +20,14 @@
 #
 # To create a distribution for PyPi run:
 #
-#    $ export KFP_TEKTON_VERSION=0.7.0-rc1
+#    $ export KFP_TEKTON_VERSION=0.8.0-rc1
 #    $ python3 setup.py sdist
 #    $ twine check dist/kfp-tekton-${KFP_TEKTON_VERSION/-rc/rc}.tar.gz
 #    $ twine upload --repository pypi dist/kfp-tekton-${KFP_TEKTON_VERSION/-rc/rc}.tar.gz
 #
 #   ... or:
 #
-#    $ make distribution KFP_TEKTON_VERSION=0.7.0-rc1
+#    $ make distribution KFP_TEKTON_VERSION=0.8.0-rc1
 #
 # =============================================================================
 
@@ -54,7 +54,7 @@
 # NOTICE, after any updates to the following, ./requirements.in should be updated
 # accordingly.
 REQUIRES = [
-    "kfp @ git+https://github.com/kubeflow/pipelines.git@1.5.0-rc.2#egg=kfp&subdirectory=sdk/python",
+    "kfp @ git+https://github.com/kubeflow/pipelines.git@1.5.0#egg=kfp&subdirectory=sdk/python",
 ]
 
 TESTS_REQUIRE = [


Test patch:
diff --git a/backend/src/common/util/workflow_test.go b/backend/src/common/util/workflow_test.go
index 2d9766ccbd..0b172c6f59 100644
--- a/backend/src/common/util/workflow_test.go
+++ b/backend/src/common/util/workflow_test.go
@@ -31,7 +31,7 @@ import (
 // Removed tests: "TestToStringForStore", "TestWorkflow_OverrideParameters", "TestWorkflow_SetLabelsToAllTemplates",
 // "TestGetWorkflowSpec", "TestGetWorkflowSpecTruncatesNameIfLongerThan200Runes", "TestVerifyParameters",
 // "TestVerifyParameters_Failed", "TestFindS3ArtifactKey_Succeed", "TestFindS3ArtifactKey_ArtifactNotFound",
-// "TestFindS3ArtifactKey_NodeNotFound", "TestReplaceUID", ""
+// "TestFindS3ArtifactKey_NodeNotFound", "TestReplaceUID"
 
 func TestWorkflow_ScheduledWorkflowUUIDAsStringOrEmpty(t *testing.T) {
 	// Base case
diff --git a/components/aws/sagemaker/tests/integration_tests/Dockerfile b/components/aws/sagemaker/tests/integration_tests/Dockerfile
index f2aadf2778..4edcf9fba2 100644
--- a/components/aws/sagemaker/tests/integration_tests/Dockerfile
+++ b/components/aws/sagemaker/tests/integration_tests/Dockerfile
@@ -7,7 +7,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
     jq
 
 # Install eksctl
-RUN curl --location "https://github.com/weaveworks/eksctl/releases/download/0.19.0/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp \
+RUN curl --location "https://github.com/weaveworks/eksctl/releases/download/0.43.0/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp \
  && mv /tmp/eksctl /usr/local/bin
 
 # Install aws-iam-authenticator
diff --git a/components/aws/sagemaker/tests/integration_tests/scripts/run_integration_tests b/components/aws/sagemaker/tests/integration_tests/scripts/run_integration_tests
index 9258d2e389..341b17ce99 100755
--- a/components/aws/sagemaker/tests/integration_tests/scripts/run_integration_tests
+++ b/components/aws/sagemaker/tests/integration_tests/scripts/run_integration_tests
@@ -110,7 +110,7 @@ function launch_eks() {
   [ ! -z "${EKS_PUBLIC_SUBNETS}" ] && eksctl_args+=( --vpc-public-subnets="${EKS_PUBLIC_SUBNETS}" )
   [ ! -z "${EKS_PRIVATE_SUBNETS}" ] && eksctl_args+=( --vpc-private-subnets="${EKS_PRIVATE_SUBNETS}" )
 
-  eksctl create cluster "${EKS_CLUSTER_NAME}" "${eksctl_args[@]}"
+  eksctl create cluster "${EKS_CLUSTER_NAME}" "${eksctl_args[@]}" --enable-ssm
 
   aws eks update-kubeconfig --name "$EKS_CLUSTER_NAME" --region "$REGION"
 
diff --git a/components/google-cloud/tests/README.md b/components/google-cloud/tests/README.md
new file mode 100644
index 0000000000..a0990367ef
--- /dev/null
+++ b/components/google-cloud/tests/README.md
@@ -0,0 +1,1 @@
+TBD
diff --git a/v2/test/samples/__init__.py b/components/google-cloud/tests/__init__.py
similarity index 78%
rename from v2/test/samples/__init__.py
rename to components/google-cloud/tests/__init__.py
index d46dbae5eb..73fa5fd2db 100644
--- a/v2/test/samples/__init__.py
+++ b/components/google-cloud/tests/__init__.py
@@ -1,13 +1,14 @@
-# Copyright 2021 Google LLC
+# Copyright 2021 Google LLC. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
 #
-#      http://www.apache.org/licenses/LICENSE-2.0
+#     http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+"""Google Cloud Components tests."""
diff --git a/components/google-cloud/tests/aiplatform/__init__.py b/components/google-cloud/tests/aiplatform/__init__.py
new file mode 100644
index 0000000000..3b261a7ab2
--- /dev/null
+++ b/components/google-cloud/tests/aiplatform/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2021 Google LLC. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Google Cloud AIPlatform Components tests."""
diff --git a/components/google-cloud/tests/aiplatform/test_remote_runner.py b/components/google-cloud/tests/aiplatform/test_remote_runner.py
new file mode 100644
index 0000000000..ace78bd7fa
--- /dev/null
+++ b/components/google-cloud/tests/aiplatform/test_remote_runner.py
@@ -0,0 +1,22 @@
+# Copyright 2021 Google LLC. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Test remote_runner module."""
+
+import mock
+import unittest
+
+class RemoteRunnerTests(unittest.TestCase):
+
+    def test_placeholder(self):
+        pass
diff --git a/components/google-cloud/tests/aiplatform/test_utils.py b/components/google-cloud/tests/aiplatform/test_utils.py
new file mode 100644
index 0000000000..544de14f70
--- /dev/null
+++ b/components/google-cloud/tests/aiplatform/test_utils.py
@@ -0,0 +1,22 @@
+# Copyright 2021 Google LLC. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Test remote_runner module."""
+
+import mock
+import unittest
+
+class UtilsTests(unittest.TestCase):
+
+    def test_placeholder(self):
+        pass
diff --git a/components/google-cloud/tests/presubmit.sh b/components/google-cloud/tests/presubmit.sh
new file mode 100755
index 0000000000..b2bedaefe0
--- /dev/null
+++ b/components/google-cloud/tests/presubmit.sh
@@ -0,0 +1,31 @@
+#!/bin/bash -ex
+# Copyright 2020 Kubeflow Pipelines contributors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+source_root=$(pwd)
+
+# Run unit tests
+cd "$source_root/components/google-cloud"
+./tests/run_test.sh
+
+# Verify package build correctly
+python setup.py bdist_wheel clean
+
+# Temporary work around for installing google.cloud.aiplatfrom from dev branch
+pip3 install git+https://github.com/googleapis/python-aiplatform@dev
+
+# Verify package can be installed and loaded correctly
+WHEEL_FILE=$(find "$source_root/components/google-cloud/dist/" -name "google_cloud_components*.whl")
+pip3 install --upgrade $WHEEL_FILE
+python -c "import google_cloud_components"
\ No newline at end of file
diff --git a/components/google-cloud/tests/run_test.sh b/components/google-cloud/tests/run_test.sh
new file mode 100755
index 0000000000..5a72c5283d
--- /dev/null
+++ b/components/google-cloud/tests/run_test.sh
@@ -0,0 +1,2 @@
+pip install -U tox virtualenv
+tox "$@"
diff --git a/frontend/src/lib/WorkflowParser.test.ts b/frontend/src/lib/WorkflowParser.test.ts
index 66cf7c9b58..8a6ab08567 100644
--- a/frontend/src/lib/WorkflowParser.test.ts
+++ b/frontend/src/lib/WorkflowParser.test.ts
@@ -535,6 +535,29 @@ describe('WorkflowParser', () => {
       });
     });
 
+    it('handles trimming output parameter name', () => {
+      const workflow = {
+        status: {
+          nodes: {
+            node1: {
+              templateName: 'my-component',
+              outputs: {
+                parameters: [
+                  {
+                    name: 'my-component-output-param1',
+                    value: 'output param1 value',
+                  },
+                ],
+              },
+            },
+          },
+        },
+      };
+      expect(WorkflowParser.getNodeInputOutputParams(workflow as any, 'node1')).toEqual({
+        inputParams: [],
+        outputParams: [['output-param1', 'output param1 value']],
+      });
+    });
     it('handles a node with one input and one output parameter', () => {
       const workflow = {
         status: {
@@ -773,6 +796,30 @@ describe('WorkflowParser', () => {
       });
     });
 
+    it('handles trimming output artifact name', () => {
+      const workflow = {
+        status: {
+          nodes: {
+            node1: {
+              templateName: 'my-component',
+              outputs: {
+                artifacts: [
+                  {
+                    name: 'my-component-output-art1',
+                    s3,
+                  },
+                ],
+              },
+            },
+          },
+        },
+      };
+      expect(WorkflowParser.getNodeInputOutputArtifacts(workflow as any, 'node1')).toEqual({
+        inputArtifacts: [],
+        outputArtifacts: [['output-art1', s3]],
+      });
+    });
+
     it('handles a node with one input and one output artifacts', () => {
       const workflow = {
         status: {
diff --git a/samples/test/README.md b/samples/test/README.md
new file mode 100644
index 0000000000..44f22f51ac
--- /dev/null
+++ b/samples/test/README.md
@@ -0,0 +1,6 @@
+# Test Samples
+
+These samples are built for testing purposes only.
+
+The [config.yaml](./config.yaml) holds test config for kubeflow-pipelines-samples-v2 test.
+Refer to [V2 samples test documentation](https://github.com/kubeflow/pipelines/tree/master/v2/test) for more details.
diff --git a/samples/test/config.yaml b/samples/test/config.yaml
new file mode 100644
index 0000000000..6ec757298b
--- /dev/null
+++ b/samples/test/config.yaml
@@ -0,0 +1,28 @@
+# Copyright 2021 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# kubeflow-pipelines-samples-v2 test config
+# Documentation: https://github.com/kubeflow/pipelines/tree/master/v2/test
+#
+#### config format
+#
+# Each item in the list corresponds to test for one sample.
+#
+# The field `path` corresponds to the test's python module path
+# e.g. if folder path is `samples/test/fail_test.py`, then module path is
+# `samples.test.fail_test`.
+- name: fail
+  path: samples.test.fail_test
+- name: two_step
+  path: samples.test.two_step_test
diff --git a/v2/test/samples/fail.py b/samples/test/fail.py
similarity index 100%
rename from v2/test/samples/fail.py
rename to samples/test/fail.py
diff --git a/v2/test/samples_config.yaml b/samples/test/fail_test.py
similarity index 66%
rename from v2/test/samples_config.yaml
rename to samples/test/fail_test.py
index 4d63eb1ee0..a2c9f308b8 100644
--- a/v2/test/samples_config.yaml
+++ b/samples/test/fail_test.py
@@ -11,12 +11,15 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+"""Fail pipeline."""
 
-# sample test config
-# path corresponds to python module path
-# e.g. if folder path is `v2/test/samples/fail_test.py`, then module path is
-# `v2.test.samples.fail_test`.
-- name: fail
-  path: v2.test.samples.fail_test
-- name: two_step
-  path: v2.test.samples.two_step_test
+from .fail import fail_pipeline
+from .util import run_pipeline_func, TestCase
+
+
+def verify(run, run_id: str):
+    assert run.status == 'Failed'
+    # TODO(Bobgy): verify MLMD status
+
+
+run_pipeline_func([TestCase(pipeline_func=fail_pipeline, verify_func=verify)])
diff --git a/v2/test/samples/two_step.py b/samples/test/two_step.py
similarity index 100%
rename from v2/test/samples/two_step.py
rename to samples/test/two_step.py
diff --git a/samples/test/two_step_test.py b/samples/test/two_step_test.py
new file mode 100644
index 0000000000..0c772897d6
--- /dev/null
+++ b/samples/test/two_step_test.py
@@ -0,0 +1,27 @@
+# Copyright 2021 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Two step v2-compatible pipeline."""
+
+from .two_step import two_step_pipeline
+from .util import run_pipeline_func, TestCase
+
+
+def verify(run, run_id: str):
+    assert run.status == 'Succeeded'
+    # TODO(Bobgy): verify MLMD status
+
+
+run_pipeline_func([
+    TestCase(pipeline_func=two_step_pipeline, verify_func=verify)
+])
diff --git a/samples/test/util.py b/samples/test/util.py
new file mode 100644
index 0000000000..70a99d71d3
--- /dev/null
+++ b/samples/test/util.py
@@ -0,0 +1,105 @@
+import kfp
+import os
+from typing import Dict, List, Callable, Optional
+from dataclasses import dataclass
+
+MINUTE = 60
+
+
+def _default_verify_func(run_id, run):
+    assert run.status == 'Succeeded'
+
+
+@dataclass
+class TestCase:
+    '''Test case for running a KFP sample'''
+    pipeline_func: Callable
+    mode: kfp.dsl.PipelineExecutionMode = kfp.dsl.PipelineExecutionMode.V2_COMPATIBLE
+    arguments: Optional[Dict[str, str]] = None
+    verify_func: Callable = _default_verify_func
+
+
+def run_pipeline_func(test_cases: List[TestCase]):
+    """Run a pipeline function and wait for its result.
+
+    :param pipeline_func: pipeline function to run
+    :type pipeline_func: function
+    """
+
+    def test_wrapper(run_pipeline):
+        for case in test_cases:
+            result = run_pipeline(
+                pipeline_func=case.pipeline_func,
+                mode=case.mode,
+                arguments=case.arguments or {}
+            )
+            case.verify_func(run=result, run_id=result.id)
+
+    _run_test(test_wrapper)
+
+
+def _run_test(callback):
+
+    def main(
+        output_directory: Optional[str] = None,  # example
+        host: Optional[str] = None,
+        external_host: Optional[str] = None,
+        launcher_image: Optional['URI'] = None,
+        experiment: str = 'v2_sample_test_samples',
+    ):
+        """Test file CLI entrypoint used by Fire.
+
+        :param host: Hostname pipelines can access, defaults to 'http://ml-pipeline:8888'.
+        :type host: str, optional
+        :param external_host: External hostname users can access from their browsers.
+        :type external_host: str, optional
+        :param output_directory: pipeline output directory that holds intermediate
+        artifacts, example gs://your-bucket/path/to/workdir.
+        :type output_directory: str, optional
+        :param launcher_image: override launcher image, only used in V2_COMPATIBLE mode
+        :type launcher_image: URI, optional
+        :param experiment: experiment the run is added to, defaults to 'v2_sample_test_samples'
+        :type experiment: str, optional
+        """
+
+        # Default to env values, so people can set up their env and run these
+        # tests without specifying any commands.
+        if host is None:
+            host = os.getenv('KFP_HOST', 'http://ml-pipeline:8888')
+        if external_host is None:
+            external_host = host
+        if output_directory is None:
+            output_directory = os.getenv('KFP_OUTPUT_DIRECTORY')
+
+        client = kfp.Client(host=host)
+
+        def run_pipeline(
+            pipeline_func: Callable,
+            mode: kfp.dsl.PipelineExecutionMode = kfp.dsl.PipelineExecutionMode.
+            V2_COMPATIBLE,
+            arguments: dict = {},
+        ):
+            run_result = client.create_run_from_pipeline_func(
+                pipeline_func,
+                mode=mode,
+                arguments={
+                    kfp.dsl.ROOT_PARAMETER_NAME: output_directory,
+                    **arguments
+                },
+                launcher_image=launcher_image,
+                experiment_name=experiment,
+            )
+            print("Run details page URL:")
+            print(f"{external_host}/#/runs/details/{run_result.run_id}")
+            run_response = run_result.wait_for_run_completion(10 * MINUTE)
+            run = run_response.run
+            from pprint import pprint
+            # Hide detailed information
+            run.pipeline_spec.workflow_manifest = None
+            pprint(run)
+            return run
+
+        callback(run_pipeline=run_pipeline)
+
+    import fire
+    fire.Fire(main)
diff --git a/sdk/python/tests/README.md b/sdk/python/tests/README.md
index af3563e05e..692d256947 100644
--- a/sdk/python/tests/README.md
+++ b/sdk/python/tests/README.md
@@ -27,7 +27,7 @@ You should see an output similar to the one below, outlining which test scripts
 which are failing:
 
 ```YAML
-KFP version: 1.5.0-rc.2  # TODO
+KFP version: 1.5.0
 
 SUCCESS: add_pod_env.py
 SUCCESS: artifact_passing_using_volume.py
diff --git a/sdk/python/tests/test_kfp_samples.sh b/sdk/python/tests/test_kfp_samples.sh
index dbaf214abd..5af67d19cf 100755
--- a/sdk/python/tests/test_kfp_samples.sh
+++ b/sdk/python/tests/test_kfp_samples.sh
@@ -63,7 +63,7 @@ while (( $# > 0 )); do
 done
 
 # define global variables
-KFP_VERSION=${KFP_VERSION:-1.5.0-rc.2}  # TODO
+KFP_VERSION=${KFP_VERSION:-1.5.0}
 KFP_REPO_URL="https://github.com/kubeflow/pipelines.git"
 SCRIPT_DIR="$(cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)"
 PROJECT_DIR="${TRAVIS_BUILD_DIR:-$(cd "${SCRIPT_DIR%/sdk/python/tests}"; pwd)}"
diff --git a/v2/test/Dockerfile b/v2/test/Dockerfile
index 61bf8a3578..395b5f28f0 100644
--- a/v2/test/Dockerfile
+++ b/v2/test/Dockerfile
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-FROM python:3.7-alpine
+FROM python:3.7-slim
 
 WORKDIR /workdir
 COPY . /workdir
diff --git a/v2/test/README.md b/v2/test/README.md
index 3cdac50742..5f776aa799 100644
--- a/v2/test/README.md
+++ b/v2/test/README.md
@@ -3,9 +3,17 @@
 Note, the sample test only runs on Google Cloud at the moment. Welcome
 contribution if you want to adapt it to other platforms.
 
+Quick Links:
+
+* [prowjob config](https://github.com/GoogleCloudPlatform/oss-test-infra/blob/48b09567c8df28fab2d3f2fb6df86defa12207fb/prow/prowjobs/kubeflow/pipelines/kubeflow-pipelines-presubmits.yaml#L184-L192)
+* [past prow jobs](https://oss-prow.knative.dev/job-history/gs/oss-prow/pr-logs/directory/kubeflow-pipelines-samples-v2)
+* [sample test config](../../samples/test/config.yaml)
+* [KFP test cluster hostname](https://github.com/kubeflow/testing/blob/master/test-infra/kfp/endpoint)
+* [Infra as Code configuration for kfp-ci project](https://github.com/kubeflow/testing/tree/master/test-infra/kfp).
+
 ## How to access the KFP UI running these tests?
 
-kubeflow-pipelines-sample-v2 test pipeline runs on `kfp-standalone-1` cluster,
+kubeflow-pipelines-sample-v2 test pipeline runs on [kfp-standalone-1 cluster](https://console.cloud.google.com/kubernetes/clusters/details/us-central1/kfp-standalone-1/details?folder=&organizationId=&project=kfp-ci),
 `kfp-ci` project, `kubeflow.org` organization.
 
 The test script prints KFP host URL in logs. You need to have permission to
@@ -21,22 +29,24 @@ Contact @Bobgy if you have such a need.
 
 ## How to run the entire sample test suite in your own KFP?
 
-You need to create an `.env` file in this folder and add the following config to
-it:
+You need to create an `.env` file in this folder and add the following config:
 
 ```env
 GCS_ROOT=gs://path/to/sample/test/workingdir
 GCR_ROOT=gcr.io/path/to/sample/test/container/registry
-HOST=https://<your KFP host>
+HOST=https://your.kfp.hostname.com
 ```
 
 You need to login locally to allow uploading source folder to the GCS_ROOT:
 
 ```bash
 gcloud auth application-default login
+# Or use the following to login both gcloud and application default
+# at the same time.
+gcloud auth login --update-adc
 ```
 
-Your KFP cluster should have permission the GCS_ROOT and the GCR_ROOT.
+Your KFP cluster should have permission for the GCS_ROOT and the GCR_ROOT.
 
 Run sample test by:
 
@@ -55,19 +65,20 @@ For why the caveat exists, refer to context rule in [Makefile](./Makefile).
 
 ```bash
 cd ${REPO_ROOT}
-python -m v2.test.samples.<your_test_name> --host <your-KFP-host> --output_directory gs://your-bucket/path/to/output/dir
-# or to see all available command line arguments
-python -m v2.test.samples.<your_test_name> --help
+# if you have a sample test at samples/path/to/your/sample_test.py
+python -m samples.path.to.your.sample_test --host https://your.KFP.host --output_directory gs://your-bucket/path/to/output/dir
+# or to look at command help
+python -m samples.path.to.your.sample_test --help
 ```
 
-## How to add a sample to this test infra?
+## How to add a sample to this sample test?
 
-Edit [samples_config.yaml](./samples_config.yaml) and add your own sample.
-You can also add samples not in the `v2` folder.
+Edit [samples/test/config.yaml](../../samples/test/config.yaml) and add your own sample.
+You can also add other samples not in the `samples/test` folder.
 
-Your sample needs to conform to the standard interface in
+Your sample test needs to conform to the standard interface in
 [components/run_sample.yaml](components/run_sample.yaml). You can refer to
-existing [samples](samples) for how to implement the interface.
+existing [sample tests](../../samples/test) for how to implement the interface.
 
 ## Implementation Details
 
@@ -81,8 +92,3 @@ the following steps:
    1. builds needed images
    2. compiles, creates and waits for sub sample KFP pipelines
    3. verifies execution result of sample pipelines
-
-## How is test infra set up?
-
-* [Prow test config for this presubmit test](https://github.com/GoogleCloudPlatform/oss-test-infra/blob/a4dda24bcc0afc811c4cda9671c2bc48da499cef/prow/prowjobs/kubeflow/pipelines/kubeflow-pipelines-presubmits.yaml#L184-L192).
-* [Infra as Code configuration for kfp-ci project](https://github.com/kubeflow/testing/tree/master/test-infra/kfp).
diff --git a/v2/test/components/run_sample.yaml b/v2/test/components/run_sample.yaml
index 482c75fdaa..492d0df558 100644
--- a/v2/test/components/run_sample.yaml
+++ b/v2/test/components/run_sample.yaml
@@ -12,33 +12,26 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-name: Run KFP Sample
+name: Run KFP Test Sample
 inputs:
 - {name: Name, type: String}
 - {name: Sample Path, type: Path}
 - {name: GCS Root, type: URI}
 - {name: Host, type: URI, default: "http://ml-pipeline:8888"}
+- {name: External Host, type: URI}
 - {name: Launcher Image, type: URI, default: "gcr.io/ml-pipeline/kfp-launcher:latest"}
 implementation:
   container:
     image: python:3.7-alpine
     command:
-    - sh
-    - -exc
-    - |
-        sample_path="$0"
-        name="$1"
-        root="$2"
-        host="$3"
-        launcher_image="$4"
-
-        python3 -m "$sample_path" \
-          --pipeline_root "$root/$name" \
-          --host "$host" \
-          --launcher_image "$launcher_image"
-
+    - python3
+    - -m
     - inputValue: Sample Path
-    - inputValue: Name
-    - inputValue: GCS Root
+    - --output_directory
+    - concat: [{inputValue: GCS Root}, '/', {inputValue: Name}]
+    - --host
     - inputValue: Host
+    - --external_host
+    - inputValue: External Host
+    - --launcher_image
     - inputValue: Launcher Image
diff --git a/v2/test/requirements.txt b/v2/test/requirements.txt
index c1d1ef2cb6..ee47120158 100644
--- a/v2/test/requirements.txt
+++ b/v2/test/requirements.txt
@@ -1,1 +1,2 @@
+# install kfp sdk from local path
 -e ../../sdk/python
diff --git a/v2/test/sample_test.py b/v2/test/sample_test.py
index b7e647b921..e71187b949 100644
--- a/v2/test/sample_test.py
+++ b/v2/test/sample_test.py
@@ -14,9 +14,12 @@
 
 # %%
 import yaml
+import os
 
+REPO_ROOT = os.path.join('..', '..')
+SAMPLES_CONFIG_PATH = os.path.join(REPO_ROOT, 'samples', 'test', 'config.yaml')
 SAMPLES_CONFIG = None
-with open('samples_config.yaml', 'r') as stream:
+with open(SAMPLES_CONFIG_PATH, 'r') as stream:
     SAMPLES_CONFIG = yaml.safe_load(stream)
 
 import kfp
@@ -66,7 +69,7 @@ def v2_sample_test(
             name=sample.name,
             sample_path=sample.path,
             gcs_root=gcs_root,
-            host=kfp_host,
+            external_host=kfp_host,
             launcher_image=build_kfp_launcher_op.outputs['digest']
         )
         run_sample_op.container.image = build_samples_image_op.outputs['digest']
diff --git a/v2/test/samples/README.md b/v2/test/samples/README.md
deleted file mode 100644
index 79cd0d4425..0000000000
--- a/v2/test/samples/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Test Samples
-
-These samples are built for testing purposes only.
diff --git a/v2/test/samples/fail_test.py b/v2/test/samples/fail_test.py
deleted file mode 100644
index db183b9d3d..0000000000
--- a/v2/test/samples/fail_test.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2021 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Fail pipeline."""
-
-import kfp
-from .fail import fail_pipeline
-
-MINUTE = 60  # seconds
-
-
-def main(
-    pipeline_root: str = 'gs://your-bucket/path/to/workdir',
-    host: str = 'http://ml-pipeline:8888',
-    launcher_image: 'URI' = None,
-    experiment: str = 'v2_sample_test_samples'
-):
-    client = kfp.Client(host=host)
-    run_result = client.create_run_from_pipeline_func(
-        fail_pipeline,
-        mode=kfp.dsl.PipelineExecutionMode.V2_COMPATIBLE,
-        arguments={kfp.dsl.ROOT_PARAMETER_NAME: pipeline_root},
-        launcher_image=launcher_image,
-        experiment_name=experiment,
-    )
-    print("Run details page URL:")
-    print(f"{host}/#/runs/details/{run_result.run_id}")
-    run_response = run_result.wait_for_run_completion(timeout=10 * MINUTE)
-    run = run_response.run
-    from pprint import pprint
-    pprint(run_response.run)
-    print("Run details page URL:")
-    print(f"{host}/#/runs/details/{run.id}")
-    assert run.status == 'Failed'
-    # TODO: add more MLMD verification
-
-
-if __name__ == '__main__':
-    import fire
-    fire.Fire(main)
diff --git a/v2/test/samples/two_step_test.py b/v2/test/samples/two_step_test.py
deleted file mode 100644
index 88e42b0cf3..0000000000
--- a/v2/test/samples/two_step_test.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2021 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Two step v2-compatible pipeline."""
-
-import kfp
-from .two_step import two_step_pipeline
-
-MINUTE = 60
-
-
-def main(
-    pipeline_root: str = 'gs://your-bucket/path/to/workdir',
-    host: str = 'http://ml-pipeline:8888',
-    launcher_image: 'URI' = None,
-    experiment: str = 'v2_sample_test_samples',
-):
-    client = kfp.Client(host=host)
-    run_result = client.create_run_from_pipeline_func(
-        two_step_pipeline,
-        mode=kfp.dsl.PipelineExecutionMode.V2_COMPATIBLE,
-        arguments={kfp.dsl.ROOT_PARAMETER_NAME: pipeline_root},
-        launcher_image=launcher_image,
-        experiment_name=experiment,
-    )
-    print("Run details page URL:")
-    print(f"{host}/#/runs/details/{run_result.run_id}")
-    run_response = run_result.wait_for_run_completion(10 * MINUTE)
-    run = run_response.run
-    from pprint import pprint
-    pprint(run_response.run)
-    print("Run details page URL:")
-    print(f"{host}/#/runs/details/{run_result.run_id}")
-    assert run.status == 'Succeeded'
-    # TODO(Bobgy): print debug info
-
-
-if __name__ == '__main__':
-    import fire
-    fire.Fire(main)