Repository: knative/client
Pull request #556 (2019-12-15 16:49:06)

Add ApiServer source update and describe commands
## Proposed Changes
- Add `kn source apiserver update` and `kn source apiserver describe`
- Dont return created ApiServer source object but only error
- Align creating ApiServer source client, removes unit tests
- Add ApiServer source update command
- Rename TestMockKnClient to TestMockKnCronJobSourceClient
- Add mock client for ApiServer Source and its tests
- Add mock unit tests for create, delete and update
- Add e2e tests for ApiServer source update
  - Add a test for ApiServer source sink update
  - Verify the updated sink name after the ApiServer source is updated
  - Update resource names in existing tests
- Use builder pattern to generate ApiServer source

/lint

knative-prow-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/knative/client/pull/556#" title="Author self-approved">navidshaikh</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=knative%2Fclient).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/knative/client/blob/master/OWNERS)~~ [navidshaikh]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-client-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/eventing/sources/v1alpha1/apiserver_client.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206254921557479425/artifacts/line-cov.html#file0) | 62.5% | 31.2% | -31.2
[pkg/eventing/sources/v1alpha1/apiserver_client_mock.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206254921557479425/artifacts/line-cov.html#file1) | Do not exist | 89.5% | 
[pkg/kn/commands/source/apiserver/apiserver.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206254921557479425/artifacts/line-cov.html#file3) | 100.0% | 55.0% | -45.0
[pkg/kn/commands/source/apiserver/create.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206254921557479425/artifacts/line-cov.html#file4) | 81.2% | 84.4% | 3.1
[pkg/kn/commands/source/apiserver/delete.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206254921557479425/artifacts/line-cov.html#file5) | 76.5% | 82.4% | 5.9
[pkg/kn/commands/source/apiserver/flags.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206254921557479425/artifacts/line-cov.html#file6) | Do not exist | 88.9% | 
[pkg/kn/commands/source/apiserver/update.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206254921557479425/artifacts/line-cov.html#file7) | Do not exist | 78.8% | 

knative-prow-robot: @navidshaikh: The following test **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-client-go-coverage | 43408fc82632045b16cf11bbb538a4e24e8e0d0b | [link](https://prow.knative.dev/view/gcs/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206254921557479425) | `/test pull-knative-client-go-coverage`

[Full PR test history](https://gubernator.knative.dev/pr/knative_client/556). [Your PR dashboard](https://gubernator.knative.dev/pr/navidshaikh).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-client-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/eventing/sources/v1alpha1/apiserver_client.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206516785822568448/artifacts/line-cov.html#file0) | 62.5% | 18.5% | -44.0
[pkg/eventing/sources/v1alpha1/apiserver_client_mock.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206516785822568448/artifacts/line-cov.html#file1) | Do not exist | 89.5% | 
[pkg/kn/commands/source/apiserver/apiserver.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206516785822568448/artifacts/line-cov.html#file3) | 100.0% | 55.0% | -45.0
[pkg/kn/commands/source/apiserver/create.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206516785822568448/artifacts/line-cov.html#file4) | 81.2% | 85.2% | 3.9
[pkg/kn/commands/source/apiserver/delete.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206516785822568448/artifacts/line-cov.html#file5) | 76.5% | 82.4% | 5.9
[pkg/kn/commands/source/apiserver/flags.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206516785822568448/artifacts/line-cov.html#file6) | Do not exist | 95.2% | 
[pkg/kn/commands/source/apiserver/update.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206516785822568448/artifacts/line-cov.html#file7) | Do not exist | 78.9% | 

knative-prow-robot: @navidshaikh: The following test **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-client-go-coverage | 6418749cdc6161392ca88bb2cdde6d6e27225659 | [link](https://prow.knative.dev/view/gcs/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206516785822568448) | `/test pull-knative-client-go-coverage`

[Full PR test history](https://gubernator.knative.dev/pr/knative_client/556). [Your PR dashboard](https://gubernator.knative.dev/pr/navidshaikh).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
knative-prow-robot: @navidshaikh: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-client-go-coverage | 6418749cdc6161392ca88bb2cdde6d6e27225659 | [link](https://prow.knative.dev/view/gcs/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206516785822568448) | `/test pull-knative-client-go-coverage`
pull-knative-client-integration-tests-latest-release | 6418749cdc6161392ca88bb2cdde6d6e27225659 | [link](https://prow.knative.dev/view/gcs/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-integration-tests-latest-release/1206516785822568449) | `/test pull-knative-client-integration-tests-latest-release`

[Full PR test history](https://gubernator.knative.dev/pr/knative_client/556). [Your PR dashboard](https://gubernator.knative.dev/pr/navidshaikh).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
knative-prow-robot: @navidshaikh: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-client-go-coverage | 6418749cdc6161392ca88bb2cdde6d6e27225659 | [link](https://prow.knative.dev/view/gcs/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206516785822568448) | `/test pull-knative-client-go-coverage`
pull-knative-client-integration-tests-latest-release | 6418749cdc6161392ca88bb2cdde6d6e27225659 | [link](https://prow.knative.dev/view/gcs/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-integration-tests-latest-release/1206516785822568449) | `/test pull-knative-client-integration-tests-latest-release`
pull-knative-client-integration-tests | 6418749cdc6161392ca88bb2cdde6d6e27225659 | [link](https://prow.knative.dev/view/gcs/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-integration-tests/1206516785826762752) | `/test pull-knative-client-integration-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative_client/556). [Your PR dashboard](https://gubernator.knative.dev/pr/navidshaikh).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-client-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/eventing/sources/v1alpha1/apiserver_client.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206544468891668480/artifacts/line-cov.html#file0) | 62.5% | 100.0% | 37.5
[pkg/eventing/sources/v1alpha1/apiserver_client_mock.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206544468891668480/artifacts/line-cov.html#file1) | Do not exist | 89.5% | 
[pkg/kn/commands/source/apiserver/apiserver.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206544468891668480/artifacts/line-cov.html#file3) | 100.0% | 55.0% | -45.0
[pkg/kn/commands/source/apiserver/create.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206544468891668480/artifacts/line-cov.html#file4) | 81.2% | 85.2% | 3.9
[pkg/kn/commands/source/apiserver/delete.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206544468891668480/artifacts/line-cov.html#file5) | 76.5% | 82.4% | 5.9
[pkg/kn/commands/source/apiserver/flags.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206544468891668480/artifacts/line-cov.html#file6) | Do not exist | 95.2% | 
[pkg/kn/commands/source/apiserver/update.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206544468891668480/artifacts/line-cov.html#file7) | Do not exist | 78.9% | 

navidshaikh: /lint
knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-client-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/eventing/sources/v1alpha1/apiserver_client.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206578697776140288/artifacts/line-cov.html#file0) | 62.5% | 100.0% | 37.5
[pkg/eventing/sources/v1alpha1/apiserver_client_mock.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206578697776140288/artifacts/line-cov.html#file1) | Do not exist | 89.5% | 
[pkg/kn/commands/source/apiserver/apiserver.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206578697776140288/artifacts/line-cov.html#file4) | 100.0% | 55.0% | -45.0
[pkg/kn/commands/source/apiserver/create.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206578697776140288/artifacts/line-cov.html#file5) | 81.2% | 85.2% | 3.9
[pkg/kn/commands/source/apiserver/delete.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206578697776140288/artifacts/line-cov.html#file6) | 76.5% | 82.4% | 5.9
[pkg/kn/commands/source/apiserver/flags.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206578697776140288/artifacts/line-cov.html#file7) | Do not exist | 95.2% | 
[pkg/kn/commands/source/apiserver/update.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206578697776140288/artifacts/line-cov.html#file8) | Do not exist | 78.9% | 

knative-metrics-robot: The following is the coverage report on the affected files.
Say `/test pull-knative-client-go-coverage` to re-run this coverage report

File | Old Coverage | New Coverage | Delta
---- |:------------:|:------------:|:-----:
[pkg/eventing/sources/v1alpha1/apiserver_client.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206581843185373184/artifacts/line-cov.html#file0) | 62.5% | 100.0% | 37.5
[pkg/eventing/sources/v1alpha1/apiserver_client_mock.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206581843185373184/artifacts/line-cov.html#file1) | Do not exist | 89.5% | 
[pkg/kn/commands/source/apiserver/apiserver.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206581843185373184/artifacts/line-cov.html#file4) | 100.0% | 55.0% | -45.0
[pkg/kn/commands/source/apiserver/create.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206581843185373184/artifacts/line-cov.html#file5) | 81.2% | 85.2% | 3.9
[pkg/kn/commands/source/apiserver/delete.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206581843185373184/artifacts/line-cov.html#file6) | 76.5% | 82.4% | 5.9
[pkg/kn/commands/source/apiserver/flags.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206581843185373184/artifacts/line-cov.html#file7) | Do not exist | 95.2% | 
[pkg/kn/commands/source/apiserver/update.go](https://storage.cloud.google.com/knative-prow/pr-logs/pull/knative_client/556/pull-knative-client-go-coverage/1206581843185373184/artifacts/line-cov.html#file8) | Do not exist | 78.9% | 


Patch:
diff --git a/docs/cmd/kn.md b/docs/cmd/kn.md
index b52df1ab..0298879a 100644
--- a/docs/cmd/kn.md
+++ b/docs/cmd/kn.md
@@ -28,5 +28,6 @@ Manage your Knative building blocks:
 * [kn route](kn_route.md)	 - Route command group
 * [kn service](kn_service.md)	 - Service command group
 * [kn source](kn_source.md)	 - Event source command group
+* [kn trigger](kn_trigger.md)	 - Trigger command group
 * [kn version](kn_version.md)	 - Prints the client version
 
diff --git a/docs/cmd/kn_source_apiserver.md b/docs/cmd/kn_source_apiserver.md
index 0b9de677..29c9fba7 100644
--- a/docs/cmd/kn_source_apiserver.md
+++ b/docs/cmd/kn_source_apiserver.md
@@ -27,6 +27,8 @@ kn source apiserver [flags]
 ### SEE ALSO
 
 * [kn source](kn_source.md)	 - Event source command group
-* [kn source apiserver create](kn_source_apiserver_create.md)	 - Create an ApiServerSource, which watches for Kubernetes events and forwards them to a sink
-* [kn source apiserver delete](kn_source_apiserver_delete.md)	 - Delete an ApiServerSource.
+* [kn source apiserver create](kn_source_apiserver_create.md)	 - Create an ApiServer source.
+* [kn source apiserver delete](kn_source_apiserver_delete.md)	 - Delete an ApiServer source.
+* [kn source apiserver describe](kn_source_apiserver_describe.md)	 - Describe an ApiServer source.
+* [kn source apiserver update](kn_source_apiserver_update.md)	 - Update an ApiServer source.
 
diff --git a/docs/cmd/kn_source_apiserver_create.md b/docs/cmd/kn_source_apiserver_create.md
index 0ddc5e5b..ec3efddf 100644
--- a/docs/cmd/kn_source_apiserver_create.md
+++ b/docs/cmd/kn_source_apiserver_create.md
@@ -1,10 +1,10 @@
 ## kn source apiserver create
 
-Create an ApiServerSource, which watches for Kubernetes events and forwards them to a sink
+Create an ApiServer source.
 
 ### Synopsis
 
-Create an ApiServerSource, which watches for Kubernetes events and forwards them to a sink
+Create an ApiServer source.
 
 ```
 kn source apiserver create NAME --resource RESOURCE --service-account ACCOUNTNAME --sink SINK --mode MODE [flags]
@@ -13,7 +13,7 @@ kn source apiserver create NAME --resource RESOURCE --service-account ACCOUNTNAM
 ### Examples
 
 ```
-  
+
   # Create an ApiServerSource 'k8sevents' which consumes Kubernetes events and sends message to service 'mysvc' as a cloudevent
   kn source apiserver create k8sevents --resource Event --service-account myaccountname --sink svc:mysvc
 ```
@@ -28,7 +28,7 @@ kn source apiserver create NAME --resource RESOURCE --service-account ACCOUNTNAM
   -n, --namespace string         Specify the namespace to operate in.
       --resource strings         Comma seperate Kind:APIVersion:isController list, e.g. Event:v1:true.
                                  "APIVersion" and "isControler" can be omitted.
-                                 "APIVersion" is "v1" by default, "isController" is "false" by default. 
+                                 "APIVersion" is "v1" by default, "isController" is "false" by default.
       --service-account string   Name of the service account to use to run this source
   -s, --sink string              Addressable sink for events
 ```
diff --git a/docs/cmd/kn_source_apiserver_delete.md b/docs/cmd/kn_source_apiserver_delete.md
index 9b362ca8..3faff99f 100644
--- a/docs/cmd/kn_source_apiserver_delete.md
+++ b/docs/cmd/kn_source_apiserver_delete.md
@@ -1,10 +1,10 @@
 ## kn source apiserver delete
 
-Delete an ApiServerSource.
+Delete an ApiServer source.
 
 ### Synopsis
 
-Delete an ApiServerSource.
+Delete an ApiServer source.
 
 ```
 kn source apiserver delete NAME [flags]
diff --git a/docs/cmd/kn_source_apiserver_describe.md b/docs/cmd/kn_source_apiserver_describe.md
new file mode 100644
index 00000000..19cd923b
--- /dev/null
+++ b/docs/cmd/kn_source_apiserver_describe.md
@@ -0,0 +1,40 @@
+## kn source apiserver describe
+
+Describe an ApiServer source.
+
+### Synopsis
+
+Describe an ApiServer source.
+
+```
+kn source apiserver describe NAME [flags]
+```
+
+### Examples
+
+```
+
+  # Describe an ApiServer source with name 'k8sevents'
+  kn source apiserver describe k8sevents
+```
+
+### Options
+
+```
+  -h, --help               help for describe
+  -n, --namespace string   Specify the namespace to operate in.
+  -v, --verbose            More output.
+```
+
+### Options inherited from parent commands
+
+```
+      --config string       kn config file (default is $HOME/.kn/config.yaml)
+      --kubeconfig string   kubectl config file (default is $HOME/.kube/config)
+      --log-http            log http traffic
+```
+
+### SEE ALSO
+
+* [kn source apiserver](kn_source_apiserver.md)	 - Kubernetes API Server Event Source command group
+
diff --git a/docs/cmd/kn_source_apiserver_update.md b/docs/cmd/kn_source_apiserver_update.md
new file mode 100644
index 00000000..8b7747a3
--- /dev/null
+++ b/docs/cmd/kn_source_apiserver_update.md
@@ -0,0 +1,47 @@
+## kn source apiserver update
+
+Update an ApiServer source.
+
+### Synopsis
+
+Update an ApiServer source.
+
+```
+kn source apiserver update NAME --resource RESOURCE --service-account ACCOUNTNAME --sink SINK --mode MODE [flags]
+```
+
+### Examples
+
+```
+
+  # Update an ApiServerSource 'k8sevents' with different service account and sink service
+  kn source apiserver update k8sevents --service-account newsa --sink svc:newsvc
+```
+
+### Options
+
+```
+  -h, --help                     help for update
+      --mode string              The mode the receive adapter controller runs under:, 
+                                 "Ref" sends only the reference to the resource, 
+                                 "Resource" send the full resource. (default "Ref")
+  -n, --namespace string         Specify the namespace to operate in.
+      --resource strings         Comma seperate Kind:APIVersion:isController list, e.g. Event:v1:true.
+                                 "APIVersion" and "isControler" can be omitted.
+                                 "APIVersion" is "v1" by default, "isController" is "false" by default.
+      --service-account string   Name of the service account to use to run this source
+  -s, --sink string              Addressable sink for events
+```
+
+### Options inherited from parent commands
+
+```
+      --config string       kn config file (default is $HOME/.kn/config.yaml)
+      --kubeconfig string   kubectl config file (default is $HOME/.kube/config)
+      --log-http            log http traffic
+```
+
+### SEE ALSO
+
+* [kn source apiserver](kn_source_apiserver.md)	 - Kubernetes API Server Event Source command group
+
diff --git a/docs/cmd/kn_trigger.md b/docs/cmd/kn_trigger.md
new file mode 100644
index 00000000..d0a2896e
--- /dev/null
+++ b/docs/cmd/kn_trigger.md
@@ -0,0 +1,33 @@
+## kn trigger
+
+Trigger command group
+
+### Synopsis
+
+Trigger command group
+
+```
+kn trigger [flags]
+```
+
+### Options
+
+```
+  -h, --help   help for trigger
+```
+
+### Options inherited from parent commands
+
+```
+      --config string       kn config file (default is $HOME/.kn/config.yaml)
+      --kubeconfig string   kubectl config file (default is $HOME/.kube/config)
+      --log-http            log http traffic
+```
+
+### SEE ALSO
+
+* [kn](kn.md)	 - Knative client
+* [kn trigger create](kn_trigger_create.md)	 - Create a trigger
+* [kn trigger delete](kn_trigger_delete.md)	 - Delete a trigger.
+* [kn trigger describe](kn_trigger_describe.md)	 - Describe a trigger.
+
diff --git a/docs/cmd/kn_trigger_create.md b/docs/cmd/kn_trigger_create.md
new file mode 100644
index 00000000..62990fd4
--- /dev/null
+++ b/docs/cmd/kn_trigger_create.md
@@ -0,0 +1,42 @@
+## kn trigger create
+
+Create a trigger
+
+### Synopsis
+
+Create a trigger
+
+```
+kn trigger create NAME --broker BROKER --filter KEY=VALUE --sink SINK [flags]
+```
+
+### Examples
+
+```
+
+  # Create a trigger 'mytrigger' to declare a subscription to events with attribute 'type=dev.knative.foo' from default broker. The subscriber is service 'mysvc'
+  kn trigger create mytrigger --broker default --filter type=dev.knative.foo --sink svc:mysvc
+```
+
+### Options
+
+```
+      --broker string      Name of the Broker which the trigger associates with. (default "default")
+      --filter []string    Key-value pair for exact CloudEvent attribute matching against incoming events, e.g type=dev.knative.foo
+  -h, --help               help for create
+  -n, --namespace string   Specify the namespace to operate in.
+  -s, --sink string        Addressable sink for events
+```
+
+### Options inherited from parent commands
+
+```
+      --config string       kn config file (default is $HOME/.kn/config.yaml)
+      --kubeconfig string   kubectl config file (default is $HOME/.kube/config)
+      --log-http            log http traffic
+```
+
+### SEE ALSO
+
+* [kn trigger](kn_trigger.md)	 - Trigger command group
+
diff --git a/docs/cmd/kn_trigger_delete.md b/docs/cmd/kn_trigger_delete.md
new file mode 100644
index 00000000..652fd4ab
--- /dev/null
+++ b/docs/cmd/kn_trigger_delete.md
@@ -0,0 +1,39 @@
+## kn trigger delete
+
+Delete a trigger.
+
+### Synopsis
+
+Delete a trigger.
+
+```
+kn trigger delete NAME [flags]
+```
+
+### Examples
+
+```
+
+  # Delete a trigger 'mytrigger' in default namespace
+  kn trigger delete mytrigger
+```
+
+### Options
+
+```
+  -h, --help               help for delete
+  -n, --namespace string   Specify the namespace to operate in.
+```
+
+### Options inherited from parent commands
+
+```
+      --config string       kn config file (default is $HOME/.kn/config.yaml)
+      --kubeconfig string   kubectl config file (default is $HOME/.kube/config)
+      --log-http            log http traffic
+```
+
+### SEE ALSO
+
+* [kn trigger](kn_trigger.md)	 - Trigger command group
+
diff --git a/docs/cmd/kn_trigger_describe.md b/docs/cmd/kn_trigger_describe.md
new file mode 100644
index 00000000..e483b277
--- /dev/null
+++ b/docs/cmd/kn_trigger_describe.md
@@ -0,0 +1,40 @@
+## kn trigger describe
+
+Describe a trigger.
+
+### Synopsis
+
+Describe a trigger.
+
+```
+kn trigger describe NAME [flags]
+```
+
+### Examples
+
+```
+
+  # Describe a trigger with name 'my-trigger'
+  kn trigger describe my-trigger
+```
+
+### Options
+
+```
+  -h, --help               help for describe
+  -n, --namespace string   Specify the namespace to operate in.
+  -v, --verbose            More output.
+```
+
+### Options inherited from parent commands
+
+```
+      --config string       kn config file (default is $HOME/.kn/config.yaml)
+      --kubeconfig string   kubectl config file (default is $HOME/.kube/config)
+      --log-http            log http traffic
+```
+
+### SEE ALSO
+
+* [kn trigger](kn_trigger.md)	 - Trigger command group
+
diff --git a/pkg/eventing/sources/v1alpha1/apiserver_client.go b/pkg/eventing/sources/v1alpha1/apiserver_client.go
index 0a6b69d2..0551690a 100644
--- a/pkg/eventing/sources/v1alpha1/apiserver_client.go
+++ b/pkg/eventing/sources/v1alpha1/apiserver_client.go
@@ -15,21 +15,27 @@
 package v1alpha1
 
 import (
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	kn_errors "knative.dev/client/pkg/errors"
 	"knative.dev/eventing/pkg/apis/sources/v1alpha1"
 	client_v1alpha1 "knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1alpha1"
-
-	kn_errors "knative.dev/client/pkg/errors"
+	duckv1beta1 "knative.dev/pkg/apis/duck/v1beta1"
 )
 
-// Interface for working with ApiServer sources
-type KnApiServerSourcesClient interface {
+// KnAPIServerSourcesClient interface for working with ApiServer sources
+type KnAPIServerSourcesClient interface {
+
+	// Get an ApiServerSource by name
+	GetAPIServerSource(name string) (*v1alpha1.ApiServerSource, error)
 
-	// Get an ApiServerSource by object
-	CreateApiServerSource(apisvrsrc *v1alpha1.ApiServerSource) (*v1alpha1.ApiServerSource, error)
+	// Create an ApiServerSource by object
+	CreateAPIServerSource(apiSource *v1alpha1.ApiServerSource) error
+
+	// Update an ApiServerSource by object
+	UpdateAPIServerSource(apiSource *v1alpha1.ApiServerSource) error
 
 	// Delete an ApiServerSource by name
-	DeleteApiServerSource(name string) error
+	DeleteAPIServerSource(name string) error
 
 	// Get namespace for this client
 	Namespace() string
@@ -43,26 +49,47 @@ type apiServerSourcesClient struct {
 	namespace string
 }
 
-// NewKnSourcesClient is to invoke Eventing Sources Client API to create object
-func newKnApiServerSourcesClient(client client_v1alpha1.ApiServerSourceInterface, namespace string) KnApiServerSourcesClient {
+// newKnAPIServerSourcesClient is to invoke Eventing Sources Client API to create object
+func newKnAPIServerSourcesClient(client client_v1alpha1.ApiServerSourceInterface, namespace string) KnAPIServerSourcesClient {
 	return &apiServerSourcesClient{
 		client:    client,
 		namespace: namespace,
 	}
 }
 
-//CreateApiServerSource is used to create an instance of ApiServerSource
-func (c *apiServerSourcesClient) CreateApiServerSource(apisvrsrc *v1alpha1.ApiServerSource) (*v1alpha1.ApiServerSource, error) {
-	ins, err := c.client.Create(apisvrsrc)
+//GetAPIServerSource returns apiSource object if present
+func (c *apiServerSourcesClient) GetAPIServerSource(name string) (*v1alpha1.ApiServerSource, error) {
+	apiSource, err := c.client.Get(name, metav1.GetOptions{})
 	if err != nil {
 		return nil, kn_errors.GetError(err)
 	}
-	return ins, nil
+
+	return apiSource, nil
+}
+
+//CreateAPIServerSource is used to create an instance of ApiServerSource
+func (c *apiServerSourcesClient) CreateAPIServerSource(apiSource *v1alpha1.ApiServerSource) error {
+	_, err := c.client.Create(apiSource)
+	if err != nil {
+		return kn_errors.GetError(err)
+	}
+
+	return nil
+}
+
+//UpdateAPIServerSource is used to update an instance of ApiServerSource
+func (c *apiServerSourcesClient) UpdateAPIServerSource(apiSource *v1alpha1.ApiServerSource) error {
+	_, err := c.client.Update(apiSource)
+	if err != nil {
+		return kn_errors.GetError(err)
+	}
+
+	return nil
 }
 
-//DeleteApiServerSource is used to create an instance of ApiServerSource
-func (c *apiServerSourcesClient) DeleteApiServerSource(name string) error {
-	err := c.client.Delete(name, &v1.DeleteOptions{})
+//DeleteAPIServerSource is used to create an instance of ApiServerSource
+func (c *apiServerSourcesClient) DeleteAPIServerSource(name string) error {
+	err := c.client.Delete(name, &metav1.DeleteOptions{})
 	return err
 }
 
@@ -70,3 +97,51 @@ func (c *apiServerSourcesClient) DeleteApiServerSource(name string) error {
 func (c *apiServerSourcesClient) Namespace() string {
 	return c.namespace
 }
+
+// APIServerSourceBuilder is for building the source
+type APIServerSourceBuilder struct {
+	apiServerSource *v1alpha1.ApiServerSource
+}
+
+// NewAPIServerSourceBuilder for building ApiServer source object
+func NewAPIServerSourceBuilder(name string) *APIServerSourceBuilder {
+	return &APIServerSourceBuilder{apiServerSource: &v1alpha1.ApiServerSource{
+		ObjectMeta: metav1.ObjectMeta{
+			Name: name,
+		},
+	}}
+}
+
+// NewAPIServerSourceBuilderFromExisting for building the object from existing ApiServerSource object
+func NewAPIServerSourceBuilderFromExisting(apiServerSource *v1alpha1.ApiServerSource) *APIServerSourceBuilder {
+	return &APIServerSourceBuilder{apiServerSource: apiServerSource.DeepCopy()}
+}
+
+// Resources which should be streamed
+func (b *APIServerSourceBuilder) Resources(resources []v1alpha1.ApiServerResource) *APIServerSourceBuilder {
+	b.apiServerSource.Spec.Resources = resources
+	return b
+}
+
+// ServiceAccount with which this source should operate
+func (b *APIServerSourceBuilder) ServiceAccount(sa string) *APIServerSourceBuilder {
+	b.apiServerSource.Spec.ServiceAccountName = sa
+	return b
+}
+
+// Mode for whether to send resource 'Ref' or complete 'Resource'
+func (b *APIServerSourceBuilder) Mode(mode string) *APIServerSourceBuilder {
+	b.apiServerSource.Spec.Mode = mode
+	return b
+}
+
+// Sink or destination of the source
+func (b *APIServerSourceBuilder) Sink(sink *duckv1beta1.Destination) *APIServerSourceBuilder {
+	b.apiServerSource.Spec.Sink = sink
+	return b
+}
+
+// Build the ApiServerSource object
+func (b *APIServerSourceBuilder) Build() *v1alpha1.ApiServerSource {
+	return b.apiServerSource
+}
diff --git a/pkg/eventing/sources/v1alpha1/apiserver_client_mock.go b/pkg/eventing/sources/v1alpha1/apiserver_client_mock.go
new file mode 100644
index 00000000..4ef573e0
--- /dev/null
+++ b/pkg/eventing/sources/v1alpha1/apiserver_client_mock.go
@@ -0,0 +1,109 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package v1alpha1
+
+import (
+	"testing"
+
+	"knative.dev/eventing/pkg/apis/sources/v1alpha1"
+
+	"knative.dev/client/pkg/util/mock"
+)
+
+// MockKnAPIServerSourceClient for mocking the client
+type MockKnAPIServerSourceClient struct {
+	t         *testing.T
+	recorder  *APIServerSourcesRecorder
+	namespace string
+}
+
+// NewMockKnAPIServerSourceClient returns a new mock instance which you need to record for
+func NewMockKnAPIServerSourceClient(t *testing.T, ns ...string) *MockKnAPIServerSourceClient {
+	namespace := "default"
+	if len(ns) > 0 {
+		namespace = ns[0]
+	}
+	return &MockKnAPIServerSourceClient{
+		t:        t,
+		recorder: &APIServerSourcesRecorder{mock.NewRecorder(t, namespace)},
+	}
+}
+
+// Ensure that the interface is implemented
+var _ KnAPIServerSourcesClient = &MockKnAPIServerSourceClient{}
+
+// APIServerSourcesRecorder for recording actions on source
+type APIServerSourcesRecorder struct {
+	r *mock.Recorder
+}
+
+// Recorder returns the recorder for registering API calls
+func (c *MockKnAPIServerSourceClient) Recorder() *APIServerSourcesRecorder {
+	return c.recorder
+}
+
+// Namespace of this client
+func (c *MockKnAPIServerSourceClient) Namespace() string {
+	return c.recorder.r.Namespace()
+}
+
+// GetAPIServerSource records a call for GetApiServerSource with the expected object or error. Either apiServerSource or err should be nil
+func (sr *APIServerSourcesRecorder) GetAPIServerSource(name interface{}, apiServerSource *v1alpha1.ApiServerSource, err error) {
+	sr.r.Add("GetApiServerSource", []interface{}{name}, []interface{}{apiServerSource, err})
+}
+
+// GetAPIServerSource performs a previously recorded action, failing if non has been registered
+func (c *MockKnAPIServerSourceClient) GetAPIServerSource(name string) (*v1alpha1.ApiServerSource, error) {
+	call := c.recorder.r.VerifyCall("GetApiServerSource", name)
+	return call.Result[0].(*v1alpha1.ApiServerSource), mock.ErrorOrNil(call.Result[1])
+}
+
+// CreateAPIServerSource records a call for CreateApiServerSource with the expected error
+func (sr *APIServerSourcesRecorder) CreateAPIServerSource(apiServerSource interface{}, err error) {
+	sr.r.Add("CreateApiServerSource", []interface{}{apiServerSource}, []interface{}{err})
+}
+
+// CreateAPIServerSource performs a previously recorded action, failing if non has been registered
+func (c *MockKnAPIServerSourceClient) CreateAPIServerSource(apiServerSource *v1alpha1.ApiServerSource) error {
+	call := c.recorder.r.VerifyCall("CreateApiServerSource", apiServerSource)
+	return mock.ErrorOrNil(call.Result[0])
+}
+
+// UpdateAPIServerSource records a call for UpdateAPIServerSource with the expected error (nil if none)
+func (sr *APIServerSourcesRecorder) UpdateAPIServerSource(apiServerSource interface{}, err error) {
+	sr.r.Add("UpdateAPIServerSource", []interface{}{apiServerSource}, []interface{}{err})
+}
+
+// UpdateAPIServerSource performs a previously recorded action, failing if non has been registered
+func (c *MockKnAPIServerSourceClient) UpdateAPIServerSource(apiServerSource *v1alpha1.ApiServerSource) error {
+	call := c.recorder.r.VerifyCall("UpdateAPIServerSource", apiServerSource)
+	return mock.ErrorOrNil(call.Result[0])
+}
+
+// DeleteAPIServerSource records a call for DeleteAPIServerSource with the expected error (nil if none)
+func (sr *APIServerSourcesRecorder) DeleteAPIServerSource(name interface{}, err error) {
+	sr.r.Add("DeleteAPIServerSource", []interface{}{name}, []interface{}{err})
+}
+
+// DeleteAPIServerSource performs a previously recorded action, failing if non has been registered
+func (c *MockKnAPIServerSourceClient) DeleteAPIServerSource(name string) error {
+	call := c.recorder.r.VerifyCall("DeleteAPIServerSource", name)
+	return mock.ErrorOrNil(call.Result[0])
+}
+
+// Validate validates whether every recorded action has been called
+func (sr *APIServerSourcesRecorder) Validate() {
+	sr.r.CheckThatAllRecordedMethodsHaveBeenCalled()
+}
diff --git a/pkg/eventing/sources/v1alpha1/client.go b/pkg/eventing/sources/v1alpha1/client.go
index 74049199..f0c9b1cf 100644
--- a/pkg/eventing/sources/v1alpha1/client.go
+++ b/pkg/eventing/sources/v1alpha1/client.go
@@ -22,7 +22,7 @@ import (
 // namespace specified during construction
 type KnSourcesClient interface {
 	// Get client for ApiServer sources
-	ApiServerSourcesClient() KnApiServerSourcesClient
+	APIServerSourcesClient() KnAPIServerSourcesClient
 
 	// Get client for CronJob sources
 	CronJobSourcesClient() KnCronJobSourcesClient
@@ -36,7 +36,7 @@ type sourcesClient struct {
 	namespace string
 }
 
-// Create a new client for managing all eventing built-in sources
+// NewKnSourcesClient for managing all eventing built-in sources
 func NewKnSourcesClient(client client_v1alpha1.SourcesV1alpha1Interface, namespace string) KnSourcesClient {
 	return &sourcesClient{
 		client:    client,
@@ -44,9 +44,9 @@ func NewKnSourcesClient(client client_v1alpha1.SourcesV1alpha1Interface, namespa
 	}
 }
 
-// Get the client for dealing with apiserver sources
-func (c *sourcesClient) ApiServerSourcesClient() KnApiServerSourcesClient {
-	return newKnApiServerSourcesClient(c.client.ApiServerSources(c.namespace), c.namespace)
+// ApiServerSourcesClient for dealing with ApiServer sources
+func (c *sourcesClient) APIServerSourcesClient() KnAPIServerSourcesClient {
+	return newKnAPIServerSourcesClient(c.client.ApiServerSources(c.namespace), c.namespace)
 }
 
 // Get the client for dealing with cronjob sources
diff --git a/pkg/eventing/v1alpha1/client.go b/pkg/eventing/v1alpha1/client.go
new file mode 100644
index 00000000..9431672e
--- /dev/null
+++ b/pkg/eventing/v1alpha1/client.go
@@ -0,0 +1,84 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package v1alpha1
+
+import (
+	apis_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	kn_errors "knative.dev/client/pkg/errors"
+	"knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+	client_v1alpha1 "knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1"
+)
+
+// KnEventingClient to Eventing Sources. All methods are relative to the
+// namespace specified during construction
+type KnEventingClient interface {
+	// Namespace in which this client is operating for
+	Namespace() string
+	// CreateTrigger is used to create an instance of trigger
+	CreateTrigger(trigger *v1alpha1.Trigger) (*v1alpha1.Trigger, error)
+	// DeleteTrigger is used to delete an instance of trigger
+	DeleteTrigger(name string) error
+	// GetTrigger is used to get an instance of trigger
+	GetTrigger(name string) (*v1alpha1.Trigger, error)
+}
+
+// KnEventingClient is a combination of Sources client interface and namespace
+// Temporarily help to add sources dependencies
+// May be changed when adding real sources features
+type knEventingClient struct {
+	client    client_v1alpha1.EventingV1alpha1Interface
+	namespace string
+}
+
+// NewKnEventingClient is to invoke Eventing Sources Client API to create object
+func NewKnEventingClient(client client_v1alpha1.EventingV1alpha1Interface, namespace string) KnEventingClient {
+	return &knEventingClient{
+		client:    client,
+		namespace: namespace,
+	}
+}
+
+//CreateTrigger is used to create an instance of trigger
+func (c *knEventingClient) CreateTrigger(trigger *v1alpha1.Trigger) (*v1alpha1.Trigger, error) {
+	trigger, err := c.client.Triggers(c.namespace).Create(trigger)
+	if err != nil {
+		return nil, kn_errors.GetError(err)
+	}
+	return trigger, nil
+}
+
+//DeleteTrigger is used to delete an instance of trigger
+func (c *knEventingClient) DeleteTrigger(name string) error {
+	err := c.client.Triggers(c.namespace).Delete(name, &apis_v1.DeleteOptions{})
+	if err != nil {
+		return kn_errors.GetError(err)
+	}
+	return nil
+}
+
+//GetTrigger is used to get an instance of trigger
+func (c *knEventingClient) GetTrigger(name string) (*v1alpha1.Trigger, error) {
+	trigger, err := c.client.Triggers(c.namespace).Get(name, apis_v1.GetOptions{})
+	if err != nil {
+		return nil, kn_errors.GetError(err)
+	}
+	return trigger, nil
+}
+
+// Return the client's namespace
+func (c *knEventingClient) Namespace() string {
+	return c.namespace
+}
diff --git a/pkg/eventing/v1alpha1/client_mock.go b/pkg/eventing/v1alpha1/client_mock.go
new file mode 100644
index 00000000..c5ed01e3
--- /dev/null
+++ b/pkg/eventing/v1alpha1/client_mock.go
@@ -0,0 +1,97 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package v1alpha1
+
+import (
+	"testing"
+
+	"knative.dev/client/pkg/util/mock"
+	"knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+)
+
+// MockKnEventingClient is a combine of test object and recorder
+type MockKnEventingClient struct {
+	t         *testing.T
+	recorder  *EventingRecorder
+	namespace string
+}
+
+// NewMockKnEventingClient returns a new mock instance which you need to record for
+func NewMockKnEventingClient(t *testing.T, ns ...string) *MockKnEventingClient {
+	namespace := "default"
+	if len(ns) > 0 {
+		namespace = ns[0]
+	}
+	return &MockKnEventingClient{
+		t:        t,
+		recorder: &EventingRecorder{mock.NewRecorder(t, namespace)},
+	}
+}
+
+// Ensure that the interface is implemented
+var _ KnEventingClient = &MockKnEventingClient{}
+
+// EventingRecorder is recorder for eventing objects
+type EventingRecorder struct {
+	r *mock.Recorder
+}
+
+// Recorder returns the recorder for registering API calls
+func (c *MockKnEventingClient) Recorder() *EventingRecorder {
+	return c.recorder
+}
+
+// Namespace of this client
+func (c *MockKnEventingClient) Namespace() string {
+	return c.recorder.r.Namespace()
+}
+
+// CreateTrigger records a call for CreateCronJobSource with the expected error
+func (sr *EventingRecorder) CreateTrigger(trigger interface{}, err error) {
+	sr.r.Add("CreateTrigger", []interface{}{trigger}, []interface{}{trigger, err})
+}
+
+// CreateTrigger performs a previously recorded action, failing if non has been registered
+func (c *MockKnEventingClient) CreateTrigger(trigger *v1alpha1.Trigger) (*v1alpha1.Trigger, error) {
+	call := c.recorder.r.VerifyCall("CreateTrigger", trigger)
+	return call.Result[0].(*v1alpha1.Trigger), mock.ErrorOrNil(call.Result[1])
+}
+
+// GetTrigger records a call for GetTrigger with the expected object or error. Either trigger or err should be nil
+func (sr *EventingRecorder) GetTrigger(name interface{}, trigger *v1alpha1.Trigger, err error) {
+	sr.r.Add("GetTrigger", []interface{}{name}, []interface{}{trigger, err})
+}
+
+// GetTrigger performs a previously recorded action, failing if non has been registered
+func (c *MockKnEventingClient) GetTrigger(name string) (*v1alpha1.Trigger, error) {
+	call := c.recorder.r.VerifyCall("GetTrigger", name)
+	return call.Result[0].(*v1alpha1.Trigger), mock.ErrorOrNil(call.Result[1])
+}
+
+// DeleteTrigger records a call for DeleteTrigger with the expected error (nil if none)
+func (sr *EventingRecorder) DeleteTrigger(name interface{}, err error) {
+	sr.r.Add("DeleteTrigger", []interface{}{name}, []interface{}{err})
+}
+
+// DeleteTrigger performs a previously recorded action, failing if non has been registered
+func (c *MockKnEventingClient) DeleteTrigger(name string) error {
+	call := c.recorder.r.VerifyCall("DeleteTrigger", name)
+	return mock.ErrorOrNil(call.Result[0])
+}
+
+// Validate validates whether every recorded action has been called
+func (sr *EventingRecorder) Validate() {
+	sr.r.CheckThatAllRecordedMethodsHaveBeenCalled()
+}
diff --git a/pkg/kn/commands/source/apiserver/apiserver.go b/pkg/kn/commands/source/apiserver/apiserver.go
index 3eaffc1c..54b9f931 100644
--- a/pkg/kn/commands/source/apiserver/apiserver.go
+++ b/pkg/kn/commands/source/apiserver/apiserver.go
@@ -16,16 +16,52 @@ package apiserver
 
 import (
 	"github.com/spf13/cobra"
+	"k8s.io/client-go/tools/clientcmd"
 
+	sources_v1alpha1 "knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1alpha1"
+
+	knsources_v1alpha1 "knative.dev/client/pkg/eventing/sources/v1alpha1"
 	"knative.dev/client/pkg/kn/commands"
 )
 
-func NewApiServerCommand(p *commands.KnParams) *cobra.Command {
-	apiServerImporterCmd := &cobra.Command{
+// NewAPIServerCommand for managing ApiServer source
+func NewAPIServerCommand(p *commands.KnParams) *cobra.Command {
+	apiServerSourceCmd := &cobra.Command{
 		Use:   "apiserver",
 		Short: "Kubernetes API Server Event Source command group",
 	}
-	apiServerImporterCmd.AddCommand(NewApiServerCreateCommand(p))
-	apiServerImporterCmd.AddCommand(NewApiServerDeleteCommand(p))
-	return apiServerImporterCmd
+	apiServerSourceCmd.AddCommand(NewAPIServerCreateCommand(p))
+	apiServerSourceCmd.AddCommand(NewAPIServerUpdateCommand(p))
+	apiServerSourceCmd.AddCommand(NewAPIServerDescribeCommand(p))
+	apiServerSourceCmd.AddCommand(NewAPIServerDeleteCommand(p))
+	return apiServerSourceCmd
+}
+
+var apiServerSourceClientFactory func(config clientcmd.ClientConfig, namespace string) (knsources_v1alpha1.KnAPIServerSourcesClient, error)
+
+func newAPIServerSourceClient(p *commands.KnParams, cmd *cobra.Command) (knsources_v1alpha1.KnAPIServerSourcesClient, error) {
+	namespace, err := p.GetNamespace(cmd)
+	if err != nil {
+		return nil, err
+	}
+
+	if apiServerSourceClientFactory != nil {
+		config, err := p.GetClientConfig()
+		if err != nil {
+			return nil, err
+		}
+		return apiServerSourceClientFactory(config, namespace)
+	}
+
+	clientConfig, err := p.RestConfig()
+	if err != nil {
+		return nil, err
+	}
+
+	client, err := sources_v1alpha1.NewForConfig(clientConfig)
+	if err != nil {
+		return nil, err
+	}
+
+	return knsources_v1alpha1.NewKnSourcesClient(client, namespace).APIServerSourcesClient(), nil
 }
diff --git a/pkg/kn/commands/source/apiserver/create.go b/pkg/kn/commands/source/apiserver/create.go
index dc7be52c..d3452324 100644
--- a/pkg/kn/commands/source/apiserver/create.go
+++ b/pkg/kn/commands/source/apiserver/create.go
@@ -20,42 +20,38 @@ import (
 
 	"github.com/spf13/cobra"
 
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"knative.dev/client/pkg/eventing/sources/v1alpha1"
 	"knative.dev/client/pkg/kn/commands"
 	"knative.dev/client/pkg/kn/commands/flags"
-	"knative.dev/eventing/pkg/apis/sources/v1alpha1"
 )
 
-func NewApiServerCreateCommand(p *commands.KnParams) *cobra.Command {
-	var apiServerUpdateFlags ApiServerSourceUpdateFlags
+// NewAPIServerCreateCommand for creating source
+func NewAPIServerCreateCommand(p *commands.KnParams) *cobra.Command {
+	var updateFlags APIServerSourceUpdateFlags
 	var sinkFlags flags.SinkFlags
 
 	cmd := &cobra.Command{
 		Use:   "create NAME --resource RESOURCE --service-account ACCOUNTNAME --sink SINK --mode MODE",
-		Short: "Create an ApiServerSource, which watches for Kubernetes events and forwards them to a sink",
-		Example: `  
+		Short: "Create an ApiServer source.",
+		Example: `
   # Create an ApiServerSource 'k8sevents' which consumes Kubernetes events and sends message to service 'mysvc' as a cloudevent
   kn source apiserver create k8sevents --resource Event --service-account myaccountname --sink svc:mysvc`,
 
 		RunE: func(cmd *cobra.Command, args []string) (err error) {
 			if len(args) != 1 {
-				return errors.New("'source apiserver create' requires the name of the source as single argument")
+				return errors.New("requires the name of the source to create as single argument")
 			}
 			name := args[0]
 
-			// get namespace
-			namespace, err := p.GetNamespace(cmd)
-			if err != nil {
-				return err
-			}
-
 			// get client
-			sourcesClient, err := p.NewSourcesClient(namespace)
+			apiSourceClient, err := newAPIServerSourceClient(p, cmd)
 			if err != nil {
 				return err
 			}
 
-			// resolve sink
+			namespace := apiSourceClient.Namespace()
+
+			// create Serving client for resolving service sink
 			servingClient, err := p.NewServingClient(namespace)
 			if err != nil {
 				return err
@@ -68,43 +64,31 @@ func NewApiServerCreateCommand(p *commands.KnParams) *cobra.Command {
 						"because %s", name, namespace, err)
 			}
 
-			// construct ApiServerSource
-			apisrvsrc := constructApiServerSource(name, namespace, apiServerUpdateFlags)
-			apisrvsrc.Spec.Sink = objectRef
-
 			// create
-			_, err = sourcesClient.ApiServerSourcesClient().CreateApiServerSource(apisrvsrc)
+			err = apiSourceClient.CreateAPIServerSource(
+				v1alpha1.NewAPIServerSourceBuilder(name).
+					Resources(updateFlags.GetAPIServerResourceArray()).
+					ServiceAccount(updateFlags.ServiceAccountName).
+					Mode(updateFlags.Mode).
+					Sink(objectRef).
+					Build())
+
 			if err != nil {
 				return fmt.Errorf(
 					"cannot create ApiServerSource '%s' in namespace '%s' "+
 						"because %s", name, namespace, err)
 			}
-			fmt.Fprintf(cmd.OutOrStdout(), "ApiServerSource '%s' successfully created in namespace '%s'.\n", args[0], namespace)
-			return nil
+
+			if err == nil {
+				fmt.Fprintf(cmd.OutOrStdout(), "ApiServer source '%s' created in namespace '%s'.\n", args[0], namespace)
+			}
+
+			return err
 		},
 	}
 	commands.AddNamespaceFlags(cmd.Flags(), false)
-	apiServerUpdateFlags.Add(cmd)
+	updateFlags.Add(cmd)
 	sinkFlags.Add(cmd)
-	cmd.MarkFlagRequired("schedule")
-
+	cmd.MarkFlagRequired("resource")
 	return cmd
 }
-
-// constructApiServerSource is to create an instance of v1alpha1.ApiServerSource
-func constructApiServerSource(name string, namespace string, apiServerFlags ApiServerSourceUpdateFlags) *v1alpha1.ApiServerSource {
-
-	source := v1alpha1.ApiServerSource{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      name,
-			Namespace: namespace,
-		},
-		Spec: v1alpha1.ApiServerSourceSpec{
-			Resources:          apiServerFlags.GetApiServerResourceArray(),
-			ServiceAccountName: apiServerFlags.ServiceAccountName,
-			Mode:               apiServerFlags.Mode,
-		},
-	}
-
-	return &source
-}
diff --git a/pkg/kn/commands/source/apiserver/delete.go b/pkg/kn/commands/source/apiserver/delete.go
index 9a6b59d5..1eb5a158 100644
--- a/pkg/kn/commands/source/apiserver/delete.go
+++ b/pkg/kn/commands/source/apiserver/delete.go
@@ -22,17 +22,17 @@ import (
 	"knative.dev/client/pkg/kn/commands"
 )
 
-// NewRevisionDeleteCommand represent 'revision delete' command
-func NewApiServerDeleteCommand(p *commands.KnParams) *cobra.Command {
-	ApiServerDeleteCommand := &cobra.Command{
+// NewAPIServerDeleteCommand for deleting source
+func NewAPIServerDeleteCommand(p *commands.KnParams) *cobra.Command {
+	deleteCommand := &cobra.Command{
 		Use:   "delete NAME",
-		Short: "Delete an ApiServerSource.",
+		Short: "Delete an ApiServer source.",
 		Example: `
   # Delete an ApiServerSource 'k8sevents' in default namespace
   kn source apiserver delete k8sevents`,
 		RunE: func(cmd *cobra.Command, args []string) error {
 			if len(args) != 1 {
-				return errors.New("'source apiserver delete' requires the name of the source as single argument")
+				return errors.New("requires the name of the source as single argument")
 			}
 			name := args[0]
 
@@ -41,19 +41,19 @@ func NewApiServerDeleteCommand(p *commands.KnParams) *cobra.Command {
 				return err
 			}
 
-			sourcesClient, err := p.NewSourcesClient(namespace)
+			apiSourceClient, err := newAPIServerSourceClient(p, cmd)
 			if err != nil {
 				return err
 			}
 
-			err = sourcesClient.ApiServerSourcesClient().DeleteApiServerSource(name)
+			err = apiSourceClient.DeleteAPIServerSource(name)
 			if err != nil {
 				return err
 			}
-			fmt.Fprintf(cmd.OutOrStdout(), "ApiServerSource '%s' deleted in namespace '%s'.\n", args[0], namespace)
+			fmt.Fprintf(cmd.OutOrStdout(), "ApiServer source '%s' deleted in namespace '%s'.\n", args[0], namespace)
 			return nil
 		},
 	}
-	commands.AddNamespaceFlags(ApiServerDeleteCommand.Flags(), false)
-	return ApiServerDeleteCommand
+	commands.AddNamespaceFlags(deleteCommand.Flags(), false)
+	return deleteCommand
 }
diff --git a/pkg/kn/commands/source/apiserver/describe.go b/pkg/kn/commands/source/apiserver/describe.go
new file mode 100644
index 00000000..f90eacdf
--- /dev/null
+++ b/pkg/kn/commands/source/apiserver/describe.go
@@ -0,0 +1,124 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package apiserver
+
+import (
+	"errors"
+	"fmt"
+	"strconv"
+
+	"github.com/spf13/cobra"
+	"knative.dev/eventing/pkg/apis/sources/v1alpha1"
+	duckv1beta1 "knative.dev/pkg/apis/duck/v1beta1"
+
+	"knative.dev/client/pkg/kn/commands"
+	"knative.dev/client/pkg/printers"
+)
+
+// NewAPIServerDescribeCommand to describe an ApiServer source object
+func NewAPIServerDescribeCommand(p *commands.KnParams) *cobra.Command {
+
+	apiServerDescribe := &cobra.Command{
+		Use:   "describe NAME",
+		Short: "Describe an ApiServer source.",
+		Example: `
+  # Describe an ApiServer source with name 'k8sevents'
+  kn source apiserver describe k8sevents`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			if len(args) != 1 {
+				return errors.New("requires the name of the source as single argument")
+			}
+			name := args[0]
+
+			apiSourceClient, err := newAPIServerSourceClient(p, cmd)
+			if err != nil {
+				return err
+			}
+
+			apiSource, err := apiSourceClient.GetAPIServerSource(name)
+			if err != nil {
+				return err
+			}
+
+			out := cmd.OutOrStdout()
+			dw := printers.NewPrefixWriter(out)
+
+			printDetails, err := cmd.Flags().GetBool("verbose")
+			if err != nil {
+				return err
+			}
+
+			writeAPIServerSource(dw, apiSource, printDetails)
+			dw.WriteLine()
+			if err := dw.Flush(); err != nil {
+				return err
+			}
+
+			writeSink(dw, apiSource.Spec.Sink)
+			dw.WriteLine()
+			if err := dw.Flush(); err != nil {
+				return err
+			}
+
+			writeResources(dw, apiSource.Spec.Resources)
+			dw.WriteLine()
+			if err := dw.Flush(); err != nil {
+				return err
+			}
+
+			// Condition info
+			commands.WriteConditions(dw, apiSource.Status.Conditions, printDetails)
+			if err := dw.Flush(); err != nil {
+				return err
+			}
+
+			return nil
+		},
+	}
+	flags := apiServerDescribe.Flags()
+	commands.AddNamespaceFlags(flags, false)
+	flags.BoolP("verbose", "v", false, "More output.")
+
+	return apiServerDescribe
+}
+
+func writeResources(dw printers.PrefixWriter, resources []v1alpha1.ApiServerResource) {
+	subWriter := dw.WriteAttribute("Resources", "")
+	for _, resource := range resources {
+		subWriter.WriteAttribute("Kind", fmt.Sprintf("%s (%s)", resource.Kind, resource.APIVersion))
+		subWriter.WriteAttribute("Controller", strconv.FormatBool(resource.Controller))
+		// TODO : Add Controller Selector section here for --verbose
+	}
+}
+
+func writeSink(dw printers.PrefixWriter, sink *duckv1beta1.Destination) {
+	subWriter := dw.WriteAttribute("Sink", "")
+	subWriter.WriteAttribute("Name", sink.Ref.Name)
+	subWriter.WriteAttribute("Namespace", sink.Ref.Namespace)
+	ref := sink.Ref
+	if ref != nil {
+		subWriter.WriteAttribute("Kind", fmt.Sprintf("%s (%s)", sink.Ref.Kind, sink.Ref.APIVersion))
+	}
+	uri := sink.URI
+	if uri != nil {
+		subWriter.WriteAttribute("URI", uri.String())
+	}
+}
+
+func writeAPIServerSource(dw printers.PrefixWriter, source *v1alpha1.ApiServerSource, printDetails bool) {
+	commands.WriteMetadata(dw, &source.ObjectMeta, printDetails)
+	dw.WriteAttribute("ServiceAccountName", source.Spec.ServiceAccountName)
+	dw.WriteAttribute("Mode", source.Spec.Mode)
+}
diff --git a/pkg/kn/commands/source/apiserver/create_flag.go b/pkg/kn/commands/source/apiserver/flags.go
similarity index 75%
rename from pkg/kn/commands/source/apiserver/create_flag.go
rename to pkg/kn/commands/source/apiserver/flags.go
index b3048758..4617c2ce 100644
--- a/pkg/kn/commands/source/apiserver/create_flag.go
+++ b/pkg/kn/commands/source/apiserver/flags.go
@@ -19,27 +19,27 @@ import (
 	"strings"
 
 	"github.com/spf13/cobra"
-	sources_v1alpha1 "knative.dev/eventing/pkg/apis/sources/v1alpha1"
+	"knative.dev/eventing/pkg/apis/sources/v1alpha1"
 )
 
 const (
-	ApiVersionSplitChar = ":"
-	DefaultApiVersion   = "v1"
+	apiVersionSplitChar = ":"
+	defaultAPIVersion   = "v1"
 )
 
-// ApiServerSourceUpdateFlags are flags for create and update a ApiServerSource
-type ApiServerSourceUpdateFlags struct {
+// APIServerSourceUpdateFlags are flags for create and update a ApiServerSource
+type APIServerSourceUpdateFlags struct {
 	ServiceAccountName string
 	Mode               string
 	Resources          []string
 }
 
-// GetApiServerResourceArray is to return an array of ApiServerResource from a string. A sample is Event:v1:true,Pod:v2:false
-func (f *ApiServerSourceUpdateFlags) GetApiServerResourceArray() []sources_v1alpha1.ApiServerResource {
-	var resourceList []sources_v1alpha1.ApiServerResource
+// GetAPIServerResourceArray is to return an array of ApiServerResource from a string. A sample is Event:v1:true,Pod:v2:false
+func (f *APIServerSourceUpdateFlags) GetAPIServerResourceArray() []v1alpha1.ApiServerResource {
+	var resourceList []v1alpha1.ApiServerResource
 	for _, r := range f.Resources {
 		version, kind, controller := getValidResource(r)
-		resourceRef := sources_v1alpha1.ApiServerResource{
+		resourceRef := v1alpha1.ApiServerResource{
 			APIVersion: version,
 			Kind:       kind,
 			Controller: controller,
@@ -50,11 +50,11 @@ func (f *ApiServerSourceUpdateFlags) GetApiServerResourceArray() []sources_v1alp
 }
 
 func getValidResource(resource string) (string, string, bool) {
-	var version = DefaultApiVersion // v1 as default
+	var version = defaultAPIVersion // v1 as default
 	var isController = false        //false as default
 	var err error
 
-	parts := strings.Split(resource, ApiVersionSplitChar)
+	parts := strings.Split(resource, apiVersionSplitChar)
 	kind := parts[0]
 	if len(parts) >= 2 {
 		version = parts[1]
@@ -69,7 +69,7 @@ func getValidResource(resource string) (string, string, bool) {
 }
 
 //Add is to set parameters
-func (f *ApiServerSourceUpdateFlags) Add(cmd *cobra.Command) {
+func (f *APIServerSourceUpdateFlags) Add(cmd *cobra.Command) {
 	cmd.Flags().StringVar(&f.ServiceAccountName,
 		"service-account",
 		"",
@@ -85,5 +85,5 @@ func (f *ApiServerSourceUpdateFlags) Add(cmd *cobra.Command) {
 		nil,
 		`Comma seperate Kind:APIVersion:isController list, e.g. Event:v1:true.
 "APIVersion" and "isControler" can be omitted.
-"APIVersion" is "v1" by default, "isController" is "false" by default. `)
+"APIVersion" is "v1" by default, "isController" is "false" by default.`)
 }
diff --git a/pkg/kn/commands/source/apiserver/update.go b/pkg/kn/commands/source/apiserver/update.go
new file mode 100644
index 00000000..d24437ff
--- /dev/null
+++ b/pkg/kn/commands/source/apiserver/update.go
@@ -0,0 +1,100 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package apiserver
+
+import (
+	"errors"
+	"fmt"
+
+	"github.com/spf13/cobra"
+
+	"knative.dev/client/pkg/eventing/sources/v1alpha1"
+	"knative.dev/client/pkg/kn/commands"
+	"knative.dev/client/pkg/kn/commands/flags"
+)
+
+// NewAPIServerUpdateCommand for managing source update
+func NewAPIServerUpdateCommand(p *commands.KnParams) *cobra.Command {
+	var apiServerUpdateFlags APIServerSourceUpdateFlags
+	var sinkFlags flags.SinkFlags
+
+	cmd := &cobra.Command{
+		Use:   "update NAME --resource RESOURCE --service-account ACCOUNTNAME --sink SINK --mode MODE",
+		Short: "Update an ApiServer source.",
+		Example: `
+  # Update an ApiServerSource 'k8sevents' with different service account and sink service
+  kn source apiserver update k8sevents --service-account newsa --sink svc:newsvc`,
+
+		RunE: func(cmd *cobra.Command, args []string) (err error) {
+			if len(args) != 1 {
+				return errors.New("requires the name of the source as single argument")
+			}
+			name := args[0]
+
+			// get namespace
+			namespace, err := p.GetNamespace(cmd)
+			if err != nil {
+				return err
+			}
+
+			servingClient, err := p.NewServingClient(namespace)
+			if err != nil {
+				return err
+			}
+
+			sourcesClient, err := newAPIServerSourceClient(p, cmd)
+			if err != nil {
+				return err
+			}
+
+			source, err := sourcesClient.GetAPIServerSource(name)
+			if err != nil {
+				return err
+			}
+
+			b := v1alpha1.NewAPIServerSourceBuilderFromExisting(source)
+			if cmd.Flags().Changed("service-account") {
+				b.ServiceAccount(apiServerUpdateFlags.ServiceAccountName)
+			}
+
+			if cmd.Flags().Changed("mode") {
+				b.Mode(apiServerUpdateFlags.Mode)
+			}
+
+			if cmd.Flags().Changed("resource") {
+				b.Resources(apiServerUpdateFlags.GetAPIServerResourceArray())
+			}
+
+			if cmd.Flags().Changed("sink") {
+				objectRef, err := sinkFlags.ResolveSink(servingClient)
+				if err != nil {
+					return err
+				}
+				b.Sink(objectRef)
+			}
+
+			err = sourcesClient.UpdateAPIServerSource(b.Build())
+			if err == nil {
+				fmt.Fprintf(cmd.OutOrStdout(), "ApiServer source '%s' updated in namespace '%s'.\n", args[0], namespace)
+			}
+
+			return err
+		},
+	}
+	commands.AddNamespaceFlags(cmd.Flags(), false)
+	apiServerUpdateFlags.Add(cmd)
+	sinkFlags.Add(cmd)
+	return cmd
+}
diff --git a/pkg/kn/commands/source/source.go b/pkg/kn/commands/source/source.go
index 37c07629..88e6c378 100644
--- a/pkg/kn/commands/source/source.go
+++ b/pkg/kn/commands/source/source.go
@@ -27,7 +27,7 @@ func NewSourceCommand(p *commands.KnParams) *cobra.Command {
 		Use:   "source",
 		Short: "Event source command group",
 	}
-	sourceCmd.AddCommand(apiserver.NewApiServerCommand(p))
+	sourceCmd.AddCommand(apiserver.NewAPIServerCommand(p))
 	sourceCmd.AddCommand(NewListTypesCommand(p))
 	sourceCmd.AddCommand(cronjob.NewCronJobCommand(p))
 	return sourceCmd
diff --git a/pkg/kn/commands/trigger/create.go b/pkg/kn/commands/trigger/create.go
new file mode 100644
index 00000000..1bf38c65
--- /dev/null
+++ b/pkg/kn/commands/trigger/create.go
@@ -0,0 +1,115 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package trigger
+
+import (
+	"errors"
+	"fmt"
+
+	"github.com/spf13/cobra"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"knative.dev/client/pkg/kn/commands"
+	"knative.dev/client/pkg/kn/commands/flags"
+	"knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+	duckv1 "knative.dev/pkg/apis/duck/v1"
+)
+
+// NewTriggerCreateCommand to create trigger create command
+func NewTriggerCreateCommand(p *commands.KnParams) *cobra.Command {
+	var triggerUpdateFlags TriggerUpdateFlags
+	var sinkFlags flags.SinkFlags
+
+	cmd := &cobra.Command{
+		Use:   "create NAME --broker BROKER --filter KEY=VALUE --sink SINK",
+		Short: "Create a trigger",
+		Example: `
+  # Create a trigger 'mytrigger' to declare a subscription to events with attribute 'type=dev.knative.foo' from default broker. The subscriber is service 'mysvc'
+  kn trigger create mytrigger --broker default --filter type=dev.knative.foo --sink svc:mysvc`,
+
+		RunE: func(cmd *cobra.Command, args []string) (err error) {
+			if len(args) != 1 {
+				return errors.New("'trigger create' requires the name of the trigger as single argument")
+			}
+			name := args[0]
+
+			namespace, err := p.GetNamespace(cmd)
+			if err != nil {
+				return err
+			}
+
+			eventingClient, err := p.NewEventingClient(namespace)
+			if err != nil {
+				return err
+			}
+
+			servingClient, err := p.NewServingClient(namespace)
+			if err != nil {
+				return err
+			}
+
+			objectRef, err := sinkFlags.ResolveSink(servingClient)
+			if err != nil {
+				return fmt.Errorf(
+					"cannot create trigger '%s' in namespace '%s' "+
+						"because %s", name, namespace, err)
+			}
+
+			trigger := constructTrigger(name, namespace, triggerUpdateFlags)
+			trigger.Spec.Subscriber = &duckv1.Destination{
+				Ref: objectRef.Ref,
+				URI: objectRef.URI,
+			}
+
+			_, err = eventingClient.CreateTrigger(trigger)
+			if err != nil {
+				return fmt.Errorf(
+					"cannot create trigger '%s' in namespace '%s' "+
+						"because %s", name, namespace, err)
+			}
+			fmt.Fprintf(cmd.OutOrStdout(), "Trigger '%s' successfully created in namespace '%s'.\n", args[0], namespace)
+			return nil
+		},
+	}
+	commands.AddNamespaceFlags(cmd.Flags(), false)
+	triggerUpdateFlags.Add(cmd)
+	sinkFlags.Add(cmd)
+	cmd.MarkFlagRequired("schedule")
+
+	return cmd
+}
+
+// constructTrigger is to create an instance of v1alpha1.Trigger
+func constructTrigger(name string, namespace string, flags TriggerUpdateFlags) *v1alpha1.Trigger {
+	trigger := v1alpha1.Trigger{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      name,
+			Namespace: namespace,
+		},
+		Spec: v1alpha1.TriggerSpec{
+			Broker: flags.Broker,
+		},
+	}
+
+	filters := flags.GetFilters()
+	if filters != nil {
+		triggerFilterAttributes := v1alpha1.TriggerFilterAttributes(filters)
+		trigger.Spec.Filter = &v1alpha1.TriggerFilter{
+			Attributes: &triggerFilterAttributes,
+		}
+	}
+
+	return &trigger
+}
diff --git a/pkg/kn/commands/trigger/delete.go b/pkg/kn/commands/trigger/delete.go
new file mode 100644
index 00000000..1d465689
--- /dev/null
+++ b/pkg/kn/commands/trigger/delete.go
@@ -0,0 +1,59 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package trigger
+
+import (
+	"errors"
+	"fmt"
+
+	"github.com/spf13/cobra"
+	"knative.dev/client/pkg/kn/commands"
+)
+
+// NewTriggerDeleteCommand represent 'revision delete' command
+func NewTriggerDeleteCommand(p *commands.KnParams) *cobra.Command {
+	TriggerDeleteCommand := &cobra.Command{
+		Use:   "delete NAME",
+		Short: "Delete a trigger.",
+		Example: `
+  # Delete a trigger 'mytrigger' in default namespace
+  kn trigger delete mytrigger`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			if len(args) != 1 {
+				return errors.New("'trigger delete' requires the name of the trigger as single argument")
+			}
+			name := args[0]
+
+			namespace, err := p.GetNamespace(cmd)
+			if err != nil {
+				return err
+			}
+
+			eventingClient, err := p.NewEventingClient(namespace)
+			if err != nil {
+				return err
+			}
+
+			err = eventingClient.DeleteTrigger(name)
+			if err != nil {
+				return err
+			}
+			fmt.Fprintf(cmd.OutOrStdout(), "Trigger '%s' deleted in namespace '%s'.\n", args[0], namespace)
+			return nil
+		},
+	}
+	commands.AddNamespaceFlags(TriggerDeleteCommand.Flags(), false)
+	return TriggerDeleteCommand
+}
diff --git a/pkg/kn/commands/trigger/describe.go b/pkg/kn/commands/trigger/describe.go
new file mode 100644
index 00000000..a838e256
--- /dev/null
+++ b/pkg/kn/commands/trigger/describe.go
@@ -0,0 +1,119 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package trigger
+
+import (
+	"errors"
+	"fmt"
+
+	"github.com/spf13/cobra"
+
+	"knative.dev/client/pkg/kn/commands"
+	"knative.dev/client/pkg/printers"
+	"knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+	duckv1 "knative.dev/pkg/apis/duck/v1"
+)
+
+// NewTriggerDescribeCommand returns a new command for describe a trigger
+func NewTriggerDescribeCommand(p *commands.KnParams) *cobra.Command {
+
+	triggerDescribe := &cobra.Command{
+		Use:   "describe NAME",
+		Short: "Describe a trigger.",
+		Example: `
+  # Describe a trigger with name 'my-trigger'
+  kn trigger describe my-trigger`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			if len(args) != 1 {
+				return errors.New("'trigger describe' requires the name of the trigger as single argument")
+			}
+			name := args[0]
+
+			// get namespace
+			namespace, err := p.GetNamespace(cmd)
+			if err != nil {
+				return err
+			}
+
+			// get client
+			eventingClient, err := p.NewEventingClient(namespace)
+			if err != nil {
+				return err
+			}
+
+			trigger, err := eventingClient.GetTrigger(name)
+			if err != nil {
+				return err
+			}
+
+			out := cmd.OutOrStdout()
+			dw := printers.NewPrefixWriter(out)
+
+			printDetails, err := cmd.Flags().GetBool("verbose")
+			if err != nil {
+				return err
+			}
+
+			writeTrigger(dw, trigger, printDetails)
+			dw.WriteLine()
+			if err := dw.Flush(); err != nil {
+				return err
+			}
+
+			// Revisions summary info
+			writeSink(dw, trigger.Spec.Subscriber)
+			dw.WriteLine()
+			if err := dw.Flush(); err != nil {
+				return err
+			}
+
+			// Condition info
+			commands.WriteConditions(dw, trigger.Status.Conditions, printDetails)
+			if err := dw.Flush(); err != nil {
+				return err
+			}
+
+			return nil
+		},
+	}
+	flags := triggerDescribe.Flags()
+	commands.AddNamespaceFlags(flags, false)
+	flags.BoolP("verbose", "v", false, "More output.")
+
+	return triggerDescribe
+}
+
+func writeSink(dw printers.PrefixWriter, sink *duckv1.Destination) {
+	subWriter := dw.WriteAttribute("Sink", "")
+	subWriter.WriteAttribute("Name", sink.Ref.Name)
+	subWriter.WriteAttribute("Namespace", sink.Ref.Namespace)
+	ref := sink.Ref
+	if ref != nil {
+		subWriter.WriteAttribute("Resource", fmt.Sprintf("%s (%s)", sink.Ref.Kind, sink.Ref.APIVersion))
+	}
+	uri := sink.URI
+	if uri != nil {
+		subWriter.WriteAttribute("URI", uri.String())
+	}
+}
+
+func writeTrigger(dw printers.PrefixWriter, trigger *v1alpha1.Trigger, printDetails bool) {
+	commands.WriteMetadata(dw, &trigger.ObjectMeta, printDetails)
+	dw.WriteAttribute("Broker", trigger.Spec.Broker)
+	subWriter := dw.WriteAttribute("Filter", "")
+	for key, value := range *trigger.Spec.Filter.Attributes {
+		subWriter.WriteAttribute(key, value)
+	}
+}
diff --git a/pkg/kn/commands/trigger/flag.go b/pkg/kn/commands/trigger/flag.go
new file mode 100644
index 00000000..be3b6012
--- /dev/null
+++ b/pkg/kn/commands/trigger/flag.go
@@ -0,0 +1,67 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package trigger
+
+import (
+	"fmt"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+type filterArray []string
+
+func (filters *filterArray) String() string {
+	str := ""
+	for _, filter := range *filters {
+		str = str + filter + " "
+	}
+	return str
+}
+
+func (filters *filterArray) Set(value string) error {
+	*filters = append(*filters, value)
+	return nil
+}
+
+func (filters *filterArray) Type() string {
+	return "[]string"
+}
+
+// TriggerUpdateFlags are flags for create and update a trigger
+type TriggerUpdateFlags struct {
+	Broker  string
+	Filters filterArray
+}
+
+// GetFilter to return a map type of filters
+func (f *TriggerUpdateFlags) GetFilters() map[string]string {
+	filters := map[string]string{}
+	for _, item := range f.Filters {
+		parts := strings.Split(item, "=")
+		if len(parts) == 2 {
+			filters[parts[0]] = parts[1]
+		} else {
+			fmt.Printf("Ignore invalid filter %s", f)
+		}
+	}
+	return filters
+}
+
+//Add is to set parameters
+func (f *TriggerUpdateFlags) Add(cmd *cobra.Command) {
+	cmd.Flags().StringVar(&f.Broker, "broker", "default", "Name of the Broker which the trigger associates with.")
+	cmd.Flags().Var(&f.Filters, "filter", "Key-value pair for exact CloudEvent attribute matching against incoming events, e.g type=dev.knative.foo")
+}
diff --git a/pkg/kn/commands/trigger/trigger.go b/pkg/kn/commands/trigger/trigger.go
new file mode 100644
index 00000000..22bba086
--- /dev/null
+++ b/pkg/kn/commands/trigger/trigger.go
@@ -0,0 +1,33 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package trigger
+
+import (
+	"github.com/spf13/cobra"
+
+	"knative.dev/client/pkg/kn/commands"
+)
+
+// NewTriggerCommand to create trigger command group
+func NewTriggerCommand(p *commands.KnParams) *cobra.Command {
+	triggerCmd := &cobra.Command{
+		Use:   "trigger",
+		Short: "Trigger command group",
+	}
+	triggerCmd.AddCommand(NewTriggerCreateCommand(p))
+	triggerCmd.AddCommand(NewTriggerDeleteCommand(p))
+	triggerCmd.AddCommand(NewTriggerDescribeCommand(p))
+	return triggerCmd
+}
diff --git a/pkg/kn/commands/types.go b/pkg/kn/commands/types.go
index 748d80d0..1729ad6a 100644
--- a/pkg/kn/commands/types.go
+++ b/pkg/kn/commands/types.go
@@ -24,11 +24,13 @@ import (
 	"k8s.io/client-go/rest"
 	"k8s.io/client-go/tools/clientcmd"
 	"knative.dev/client/pkg/util"
+	eventing "knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1"
 	eventing_sources "knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1alpha1"
 	serving_v1alpha1_client "knative.dev/serving/pkg/client/clientset/versioned/typed/serving/v1alpha1"
 
 	dynamic_kn "knative.dev/client/pkg/dynamic"
 	sources_kn_v1alpha1 "knative.dev/client/pkg/eventing/sources/v1alpha1"
+	eventing_kn_v1alpha1 "knative.dev/client/pkg/eventing/v1alpha1"
 	serving_kn_v1alpha1 "knative.dev/client/pkg/serving/v1alpha1"
 )
 
@@ -46,12 +48,13 @@ type Config struct {
 
 // KnParams for creating commands. Useful for inserting mocks for testing.
 type KnParams struct {
-	Output           io.Writer
-	KubeCfgPath      string
-	ClientConfig     clientcmd.ClientConfig
-	NewServingClient func(namespace string) (serving_kn_v1alpha1.KnServingClient, error)
-	NewSourcesClient func(namespace string) (sources_kn_v1alpha1.KnSourcesClient, error)
-	NewDynamicClient func(namespace string) (dynamic_kn.KnDynamicClient, error)
+	Output            io.Writer
+	KubeCfgPath       string
+	ClientConfig      clientcmd.ClientConfig
+	NewServingClient  func(namespace string) (serving_kn_v1alpha1.KnServingClient, error)
+	NewSourcesClient  func(namespace string) (sources_kn_v1alpha1.KnSourcesClient, error)
+	NewEventingClient func(namespace string) (eventing_kn_v1alpha1.KnEventingClient, error)
+	NewDynamicClient  func(namespace string) (dynamic_kn.KnDynamicClient, error)
 
 	// General global options
 	LogHTTP bool
@@ -69,6 +72,10 @@ func (params *KnParams) Initialize() {
 		params.NewSourcesClient = params.newSourcesClient
 	}
 
+	if params.NewEventingClient == nil {
+		params.NewEventingClient = params.newEventingClient
+	}
+
 	if params.NewDynamicClient == nil {
 		params.NewDynamicClient = params.newDynamicClient
 	}
@@ -94,6 +101,16 @@ func (params *KnParams) newSourcesClient(namespace string) (sources_kn_v1alpha1.
 	return sources_kn_v1alpha1.NewKnSourcesClient(client, namespace), nil
 }
 
+func (params *KnParams) newEventingClient(namespace string) (eventing_kn_v1alpha1.KnEventingClient, error) {
+	restConfig, err := params.RestConfig()
+	if err != nil {
+		return nil, err
+	}
+
+	client, _ := eventing.NewForConfig(restConfig)
+	return eventing_kn_v1alpha1.NewKnEventingClient(client, namespace), nil
+}
+
 func (params *KnParams) newDynamicClient(namespace string) (dynamic_kn.KnDynamicClient, error) {
 	restConfig, err := params.RestConfig()
 	if err != nil {
diff --git a/pkg/kn/core/root.go b/pkg/kn/core/root.go
index 6f1d040e..cec1ec3b 100644
--- a/pkg/kn/core/root.go
+++ b/pkg/kn/core/root.go
@@ -36,6 +36,7 @@ import (
 	"knative.dev/client/pkg/kn/commands/route"
 	"knative.dev/client/pkg/kn/commands/service"
 	"knative.dev/client/pkg/kn/commands/source"
+	"knative.dev/client/pkg/kn/commands/trigger"
 	"knative.dev/client/pkg/kn/commands/version"
 	"knative.dev/client/pkg/kn/flags"
 )
@@ -144,6 +145,7 @@ func NewKnCommand(params ...commands.KnParams) *cobra.Command {
 	rootCmd.AddCommand(completion.NewCompletionCommand(p))
 	rootCmd.AddCommand(version.NewVersionCommand(p))
 	rootCmd.AddCommand(source.NewSourceCommand(p))
+	rootCmd.AddCommand(trigger.NewTriggerCommand(p))
 
 	// Deal with empty and unknown sub command groups
 	EmptyAndUnknownSubCommands(rootCmd)
diff --git a/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/broker.go b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/broker.go
new file mode 100644
index 00000000..292f384f
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/broker.go
@@ -0,0 +1,191 @@
+/*
+Copyright 2019 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"time"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	rest "k8s.io/client-go/rest"
+	v1alpha1 "knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+	scheme "knative.dev/eventing/pkg/client/clientset/versioned/scheme"
+)
+
+// BrokersGetter has a method to return a BrokerInterface.
+// A group's client should implement this interface.
+type BrokersGetter interface {
+	Brokers(namespace string) BrokerInterface
+}
+
+// BrokerInterface has methods to work with Broker resources.
+type BrokerInterface interface {
+	Create(*v1alpha1.Broker) (*v1alpha1.Broker, error)
+	Update(*v1alpha1.Broker) (*v1alpha1.Broker, error)
+	UpdateStatus(*v1alpha1.Broker) (*v1alpha1.Broker, error)
+	Delete(name string, options *v1.DeleteOptions) error
+	DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
+	Get(name string, options v1.GetOptions) (*v1alpha1.Broker, error)
+	List(opts v1.ListOptions) (*v1alpha1.BrokerList, error)
+	Watch(opts v1.ListOptions) (watch.Interface, error)
+	Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Broker, err error)
+	BrokerExpansion
+}
+
+// brokers implements BrokerInterface
+type brokers struct {
+	client rest.Interface
+	ns     string
+}
+
+// newBrokers returns a Brokers
+func newBrokers(c *EventingV1alpha1Client, namespace string) *brokers {
+	return &brokers{
+		client: c.RESTClient(),
+		ns:     namespace,
+	}
+}
+
+// Get takes name of the broker, and returns the corresponding broker object, and an error if there is any.
+func (c *brokers) Get(name string, options v1.GetOptions) (result *v1alpha1.Broker, err error) {
+	result = &v1alpha1.Broker{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("brokers").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do().
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of Brokers that match those selectors.
+func (c *brokers) List(opts v1.ListOptions) (result *v1alpha1.BrokerList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.BrokerList{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("brokers").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do().
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested brokers.
+func (c *brokers) Watch(opts v1.ListOptions) (watch.Interface, error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	opts.Watch = true
+	return c.client.Get().
+		Namespace(c.ns).
+		Resource("brokers").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch()
+}
+
+// Create takes the representation of a broker and creates it.  Returns the server's representation of the broker, and an error, if there is any.
+func (c *brokers) Create(broker *v1alpha1.Broker) (result *v1alpha1.Broker, err error) {
+	result = &v1alpha1.Broker{}
+	err = c.client.Post().
+		Namespace(c.ns).
+		Resource("brokers").
+		Body(broker).
+		Do().
+		Into(result)
+	return
+}
+
+// Update takes the representation of a broker and updates it. Returns the server's representation of the broker, and an error, if there is any.
+func (c *brokers) Update(broker *v1alpha1.Broker) (result *v1alpha1.Broker, err error) {
+	result = &v1alpha1.Broker{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("brokers").
+		Name(broker.Name).
+		Body(broker).
+		Do().
+		Into(result)
+	return
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+
+func (c *brokers) UpdateStatus(broker *v1alpha1.Broker) (result *v1alpha1.Broker, err error) {
+	result = &v1alpha1.Broker{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("brokers").
+		Name(broker.Name).
+		SubResource("status").
+		Body(broker).
+		Do().
+		Into(result)
+	return
+}
+
+// Delete takes name of the broker and deletes it. Returns an error if one occurs.
+func (c *brokers) Delete(name string, options *v1.DeleteOptions) error {
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("brokers").
+		Name(name).
+		Body(options).
+		Do().
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *brokers) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+	var timeout time.Duration
+	if listOptions.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second
+	}
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("brokers").
+		VersionedParams(&listOptions, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(options).
+		Do().
+		Error()
+}
+
+// Patch applies the patch and returns the patched broker.
+func (c *brokers) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Broker, err error) {
+	result = &v1alpha1.Broker{}
+	err = c.client.Patch(pt).
+		Namespace(c.ns).
+		Resource("brokers").
+		SubResource(subresources...).
+		Name(name).
+		Body(data).
+		Do().
+		Into(result)
+	return
+}
diff --git a/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/doc.go b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/doc.go
new file mode 100644
index 00000000..a1c6bb9f
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/doc.go
@@ -0,0 +1,20 @@
+/*
+Copyright 2019 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+// This package has the automatically generated typed clients.
+package v1alpha1
diff --git a/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/eventing_client.go b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/eventing_client.go
new file mode 100644
index 00000000..4c52ead9
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/eventing_client.go
@@ -0,0 +1,99 @@
+/*
+Copyright 2019 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	rest "k8s.io/client-go/rest"
+	v1alpha1 "knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+	"knative.dev/eventing/pkg/client/clientset/versioned/scheme"
+)
+
+type EventingV1alpha1Interface interface {
+	RESTClient() rest.Interface
+	BrokersGetter
+	EventTypesGetter
+	TriggersGetter
+}
+
+// EventingV1alpha1Client is used to interact with features provided by the eventing.knative.dev group.
+type EventingV1alpha1Client struct {
+	restClient rest.Interface
+}
+
+func (c *EventingV1alpha1Client) Brokers(namespace string) BrokerInterface {
+	return newBrokers(c, namespace)
+}
+
+func (c *EventingV1alpha1Client) EventTypes(namespace string) EventTypeInterface {
+	return newEventTypes(c, namespace)
+}
+
+func (c *EventingV1alpha1Client) Triggers(namespace string) TriggerInterface {
+	return newTriggers(c, namespace)
+}
+
+// NewForConfig creates a new EventingV1alpha1Client for the given config.
+func NewForConfig(c *rest.Config) (*EventingV1alpha1Client, error) {
+	config := *c
+	if err := setConfigDefaults(&config); err != nil {
+		return nil, err
+	}
+	client, err := rest.RESTClientFor(&config)
+	if err != nil {
+		return nil, err
+	}
+	return &EventingV1alpha1Client{client}, nil
+}
+
+// NewForConfigOrDie creates a new EventingV1alpha1Client for the given config and
+// panics if there is an error in the config.
+func NewForConfigOrDie(c *rest.Config) *EventingV1alpha1Client {
+	client, err := NewForConfig(c)
+	if err != nil {
+		panic(err)
+	}
+	return client
+}
+
+// New creates a new EventingV1alpha1Client for the given RESTClient.
+func New(c rest.Interface) *EventingV1alpha1Client {
+	return &EventingV1alpha1Client{c}
+}
+
+func setConfigDefaults(config *rest.Config) error {
+	gv := v1alpha1.SchemeGroupVersion
+	config.GroupVersion = &gv
+	config.APIPath = "/apis"
+	config.NegotiatedSerializer = scheme.Codecs.WithoutConversion()
+
+	if config.UserAgent == "" {
+		config.UserAgent = rest.DefaultKubernetesUserAgent()
+	}
+
+	return nil
+}
+
+// RESTClient returns a RESTClient that is used to communicate
+// with API server by this client implementation.
+func (c *EventingV1alpha1Client) RESTClient() rest.Interface {
+	if c == nil {
+		return nil
+	}
+	return c.restClient
+}
diff --git a/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/eventtype.go b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/eventtype.go
new file mode 100644
index 00000000..391474f2
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/eventtype.go
@@ -0,0 +1,191 @@
+/*
+Copyright 2019 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"time"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	rest "k8s.io/client-go/rest"
+	v1alpha1 "knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+	scheme "knative.dev/eventing/pkg/client/clientset/versioned/scheme"
+)
+
+// EventTypesGetter has a method to return a EventTypeInterface.
+// A group's client should implement this interface.
+type EventTypesGetter interface {
+	EventTypes(namespace string) EventTypeInterface
+}
+
+// EventTypeInterface has methods to work with EventType resources.
+type EventTypeInterface interface {
+	Create(*v1alpha1.EventType) (*v1alpha1.EventType, error)
+	Update(*v1alpha1.EventType) (*v1alpha1.EventType, error)
+	UpdateStatus(*v1alpha1.EventType) (*v1alpha1.EventType, error)
+	Delete(name string, options *v1.DeleteOptions) error
+	DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
+	Get(name string, options v1.GetOptions) (*v1alpha1.EventType, error)
+	List(opts v1.ListOptions) (*v1alpha1.EventTypeList, error)
+	Watch(opts v1.ListOptions) (watch.Interface, error)
+	Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.EventType, err error)
+	EventTypeExpansion
+}
+
+// eventTypes implements EventTypeInterface
+type eventTypes struct {
+	client rest.Interface
+	ns     string
+}
+
+// newEventTypes returns a EventTypes
+func newEventTypes(c *EventingV1alpha1Client, namespace string) *eventTypes {
+	return &eventTypes{
+		client: c.RESTClient(),
+		ns:     namespace,
+	}
+}
+
+// Get takes name of the eventType, and returns the corresponding eventType object, and an error if there is any.
+func (c *eventTypes) Get(name string, options v1.GetOptions) (result *v1alpha1.EventType, err error) {
+	result = &v1alpha1.EventType{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("eventtypes").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do().
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of EventTypes that match those selectors.
+func (c *eventTypes) List(opts v1.ListOptions) (result *v1alpha1.EventTypeList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.EventTypeList{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("eventtypes").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do().
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested eventTypes.
+func (c *eventTypes) Watch(opts v1.ListOptions) (watch.Interface, error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	opts.Watch = true
+	return c.client.Get().
+		Namespace(c.ns).
+		Resource("eventtypes").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch()
+}
+
+// Create takes the representation of a eventType and creates it.  Returns the server's representation of the eventType, and an error, if there is any.
+func (c *eventTypes) Create(eventType *v1alpha1.EventType) (result *v1alpha1.EventType, err error) {
+	result = &v1alpha1.EventType{}
+	err = c.client.Post().
+		Namespace(c.ns).
+		Resource("eventtypes").
+		Body(eventType).
+		Do().
+		Into(result)
+	return
+}
+
+// Update takes the representation of a eventType and updates it. Returns the server's representation of the eventType, and an error, if there is any.
+func (c *eventTypes) Update(eventType *v1alpha1.EventType) (result *v1alpha1.EventType, err error) {
+	result = &v1alpha1.EventType{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("eventtypes").
+		Name(eventType.Name).
+		Body(eventType).
+		Do().
+		Into(result)
+	return
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+
+func (c *eventTypes) UpdateStatus(eventType *v1alpha1.EventType) (result *v1alpha1.EventType, err error) {
+	result = &v1alpha1.EventType{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("eventtypes").
+		Name(eventType.Name).
+		SubResource("status").
+		Body(eventType).
+		Do().
+		Into(result)
+	return
+}
+
+// Delete takes name of the eventType and deletes it. Returns an error if one occurs.
+func (c *eventTypes) Delete(name string, options *v1.DeleteOptions) error {
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("eventtypes").
+		Name(name).
+		Body(options).
+		Do().
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *eventTypes) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+	var timeout time.Duration
+	if listOptions.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second
+	}
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("eventtypes").
+		VersionedParams(&listOptions, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(options).
+		Do().
+		Error()
+}
+
+// Patch applies the patch and returns the patched eventType.
+func (c *eventTypes) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.EventType, err error) {
+	result = &v1alpha1.EventType{}
+	err = c.client.Patch(pt).
+		Namespace(c.ns).
+		Resource("eventtypes").
+		SubResource(subresources...).
+		Name(name).
+		Body(data).
+		Do().
+		Into(result)
+	return
+}
diff --git a/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/doc.go b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/doc.go
new file mode 100644
index 00000000..a00e5d7b
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/doc.go
@@ -0,0 +1,20 @@
+/*
+Copyright 2019 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+// Package fake has the automatically generated clients.
+package fake
diff --git a/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/fake_broker.go b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/fake_broker.go
new file mode 100644
index 00000000..2da68546
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/fake_broker.go
@@ -0,0 +1,140 @@
+/*
+Copyright 2019 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	labels "k8s.io/apimachinery/pkg/labels"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	testing "k8s.io/client-go/testing"
+	v1alpha1 "knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+)
+
+// FakeBrokers implements BrokerInterface
+type FakeBrokers struct {
+	Fake *FakeEventingV1alpha1
+	ns   string
+}
+
+var brokersResource = schema.GroupVersionResource{Group: "eventing.knative.dev", Version: "v1alpha1", Resource: "brokers"}
+
+var brokersKind = schema.GroupVersionKind{Group: "eventing.knative.dev", Version: "v1alpha1", Kind: "Broker"}
+
+// Get takes name of the broker, and returns the corresponding broker object, and an error if there is any.
+func (c *FakeBrokers) Get(name string, options v1.GetOptions) (result *v1alpha1.Broker, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewGetAction(brokersResource, c.ns, name), &v1alpha1.Broker{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Broker), err
+}
+
+// List takes label and field selectors, and returns the list of Brokers that match those selectors.
+func (c *FakeBrokers) List(opts v1.ListOptions) (result *v1alpha1.BrokerList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewListAction(brokersResource, brokersKind, c.ns, opts), &v1alpha1.BrokerList{})
+
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.BrokerList{ListMeta: obj.(*v1alpha1.BrokerList).ListMeta}
+	for _, item := range obj.(*v1alpha1.BrokerList).Items {
+		if label.Matches(labels.Set(item.Labels)) {
+			list.Items = append(list.Items, item)
+		}
+	}
+	return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested brokers.
+func (c *FakeBrokers) Watch(opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewWatchAction(brokersResource, c.ns, opts))
+
+}
+
+// Create takes the representation of a broker and creates it.  Returns the server's representation of the broker, and an error, if there is any.
+func (c *FakeBrokers) Create(broker *v1alpha1.Broker) (result *v1alpha1.Broker, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewCreateAction(brokersResource, c.ns, broker), &v1alpha1.Broker{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Broker), err
+}
+
+// Update takes the representation of a broker and updates it. Returns the server's representation of the broker, and an error, if there is any.
+func (c *FakeBrokers) Update(broker *v1alpha1.Broker) (result *v1alpha1.Broker, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateAction(brokersResource, c.ns, broker), &v1alpha1.Broker{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Broker), err
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *FakeBrokers) UpdateStatus(broker *v1alpha1.Broker) (*v1alpha1.Broker, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateSubresourceAction(brokersResource, "status", c.ns, broker), &v1alpha1.Broker{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Broker), err
+}
+
+// Delete takes name of the broker and deletes it. Returns an error if one occurs.
+func (c *FakeBrokers) Delete(name string, options *v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewDeleteAction(brokersResource, c.ns, name), &v1alpha1.Broker{})
+
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeBrokers) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+	action := testing.NewDeleteCollectionAction(brokersResource, c.ns, listOptions)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.BrokerList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched broker.
+func (c *FakeBrokers) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Broker, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewPatchSubresourceAction(brokersResource, c.ns, name, pt, data, subresources...), &v1alpha1.Broker{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Broker), err
+}
diff --git a/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/fake_eventing_client.go b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/fake_eventing_client.go
new file mode 100644
index 00000000..4e11aec5
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/fake_eventing_client.go
@@ -0,0 +1,48 @@
+/*
+Copyright 2019 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	rest "k8s.io/client-go/rest"
+	testing "k8s.io/client-go/testing"
+	v1alpha1 "knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1"
+)
+
+type FakeEventingV1alpha1 struct {
+	*testing.Fake
+}
+
+func (c *FakeEventingV1alpha1) Brokers(namespace string) v1alpha1.BrokerInterface {
+	return &FakeBrokers{c, namespace}
+}
+
+func (c *FakeEventingV1alpha1) EventTypes(namespace string) v1alpha1.EventTypeInterface {
+	return &FakeEventTypes{c, namespace}
+}
+
+func (c *FakeEventingV1alpha1) Triggers(namespace string) v1alpha1.TriggerInterface {
+	return &FakeTriggers{c, namespace}
+}
+
+// RESTClient returns a RESTClient that is used to communicate
+// with API server by this client implementation.
+func (c *FakeEventingV1alpha1) RESTClient() rest.Interface {
+	var ret *rest.RESTClient
+	return ret
+}
diff --git a/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/fake_eventtype.go b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/fake_eventtype.go
new file mode 100644
index 00000000..81c4fd61
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/fake_eventtype.go
@@ -0,0 +1,140 @@
+/*
+Copyright 2019 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	labels "k8s.io/apimachinery/pkg/labels"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	testing "k8s.io/client-go/testing"
+	v1alpha1 "knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+)
+
+// FakeEventTypes implements EventTypeInterface
+type FakeEventTypes struct {
+	Fake *FakeEventingV1alpha1
+	ns   string
+}
+
+var eventtypesResource = schema.GroupVersionResource{Group: "eventing.knative.dev", Version: "v1alpha1", Resource: "eventtypes"}
+
+var eventtypesKind = schema.GroupVersionKind{Group: "eventing.knative.dev", Version: "v1alpha1", Kind: "EventType"}
+
+// Get takes name of the eventType, and returns the corresponding eventType object, and an error if there is any.
+func (c *FakeEventTypes) Get(name string, options v1.GetOptions) (result *v1alpha1.EventType, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewGetAction(eventtypesResource, c.ns, name), &v1alpha1.EventType{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.EventType), err
+}
+
+// List takes label and field selectors, and returns the list of EventTypes that match those selectors.
+func (c *FakeEventTypes) List(opts v1.ListOptions) (result *v1alpha1.EventTypeList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewListAction(eventtypesResource, eventtypesKind, c.ns, opts), &v1alpha1.EventTypeList{})
+
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.EventTypeList{ListMeta: obj.(*v1alpha1.EventTypeList).ListMeta}
+	for _, item := range obj.(*v1alpha1.EventTypeList).Items {
+		if label.Matches(labels.Set(item.Labels)) {
+			list.Items = append(list.Items, item)
+		}
+	}
+	return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested eventTypes.
+func (c *FakeEventTypes) Watch(opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewWatchAction(eventtypesResource, c.ns, opts))
+
+}
+
+// Create takes the representation of a eventType and creates it.  Returns the server's representation of the eventType, and an error, if there is any.
+func (c *FakeEventTypes) Create(eventType *v1alpha1.EventType) (result *v1alpha1.EventType, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewCreateAction(eventtypesResource, c.ns, eventType), &v1alpha1.EventType{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.EventType), err
+}
+
+// Update takes the representation of a eventType and updates it. Returns the server's representation of the eventType, and an error, if there is any.
+func (c *FakeEventTypes) Update(eventType *v1alpha1.EventType) (result *v1alpha1.EventType, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateAction(eventtypesResource, c.ns, eventType), &v1alpha1.EventType{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.EventType), err
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *FakeEventTypes) UpdateStatus(eventType *v1alpha1.EventType) (*v1alpha1.EventType, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateSubresourceAction(eventtypesResource, "status", c.ns, eventType), &v1alpha1.EventType{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.EventType), err
+}
+
+// Delete takes name of the eventType and deletes it. Returns an error if one occurs.
+func (c *FakeEventTypes) Delete(name string, options *v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewDeleteAction(eventtypesResource, c.ns, name), &v1alpha1.EventType{})
+
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeEventTypes) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+	action := testing.NewDeleteCollectionAction(eventtypesResource, c.ns, listOptions)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.EventTypeList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched eventType.
+func (c *FakeEventTypes) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.EventType, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewPatchSubresourceAction(eventtypesResource, c.ns, name, pt, data, subresources...), &v1alpha1.EventType{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.EventType), err
+}
diff --git a/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/fake_trigger.go b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/fake_trigger.go
new file mode 100644
index 00000000..19682083
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake/fake_trigger.go
@@ -0,0 +1,140 @@
+/*
+Copyright 2019 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	labels "k8s.io/apimachinery/pkg/labels"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	testing "k8s.io/client-go/testing"
+	v1alpha1 "knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+)
+
+// FakeTriggers implements TriggerInterface
+type FakeTriggers struct {
+	Fake *FakeEventingV1alpha1
+	ns   string
+}
+
+var triggersResource = schema.GroupVersionResource{Group: "eventing.knative.dev", Version: "v1alpha1", Resource: "triggers"}
+
+var triggersKind = schema.GroupVersionKind{Group: "eventing.knative.dev", Version: "v1alpha1", Kind: "Trigger"}
+
+// Get takes name of the trigger, and returns the corresponding trigger object, and an error if there is any.
+func (c *FakeTriggers) Get(name string, options v1.GetOptions) (result *v1alpha1.Trigger, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewGetAction(triggersResource, c.ns, name), &v1alpha1.Trigger{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Trigger), err
+}
+
+// List takes label and field selectors, and returns the list of Triggers that match those selectors.
+func (c *FakeTriggers) List(opts v1.ListOptions) (result *v1alpha1.TriggerList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewListAction(triggersResource, triggersKind, c.ns, opts), &v1alpha1.TriggerList{})
+
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.TriggerList{ListMeta: obj.(*v1alpha1.TriggerList).ListMeta}
+	for _, item := range obj.(*v1alpha1.TriggerList).Items {
+		if label.Matches(labels.Set(item.Labels)) {
+			list.Items = append(list.Items, item)
+		}
+	}
+	return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested triggers.
+func (c *FakeTriggers) Watch(opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewWatchAction(triggersResource, c.ns, opts))
+
+}
+
+// Create takes the representation of a trigger and creates it.  Returns the server's representation of the trigger, and an error, if there is any.
+func (c *FakeTriggers) Create(trigger *v1alpha1.Trigger) (result *v1alpha1.Trigger, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewCreateAction(triggersResource, c.ns, trigger), &v1alpha1.Trigger{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Trigger), err
+}
+
+// Update takes the representation of a trigger and updates it. Returns the server's representation of the trigger, and an error, if there is any.
+func (c *FakeTriggers) Update(trigger *v1alpha1.Trigger) (result *v1alpha1.Trigger, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateAction(triggersResource, c.ns, trigger), &v1alpha1.Trigger{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Trigger), err
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *FakeTriggers) UpdateStatus(trigger *v1alpha1.Trigger) (*v1alpha1.Trigger, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateSubresourceAction(triggersResource, "status", c.ns, trigger), &v1alpha1.Trigger{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Trigger), err
+}
+
+// Delete takes name of the trigger and deletes it. Returns an error if one occurs.
+func (c *FakeTriggers) Delete(name string, options *v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewDeleteAction(triggersResource, c.ns, name), &v1alpha1.Trigger{})
+
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeTriggers) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+	action := testing.NewDeleteCollectionAction(triggersResource, c.ns, listOptions)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.TriggerList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched trigger.
+func (c *FakeTriggers) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Trigger, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewPatchSubresourceAction(triggersResource, c.ns, name, pt, data, subresources...), &v1alpha1.Trigger{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.Trigger), err
+}
diff --git a/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/generated_expansion.go b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/generated_expansion.go
new file mode 100644
index 00000000..f31f68a6
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/generated_expansion.go
@@ -0,0 +1,25 @@
+/*
+Copyright 2019 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+type BrokerExpansion interface{}
+
+type EventTypeExpansion interface{}
+
+type TriggerExpansion interface{}
diff --git a/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/trigger.go b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/trigger.go
new file mode 100644
index 00000000..65b68f11
--- /dev/null
+++ b/vendor/knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/trigger.go
@@ -0,0 +1,191 @@
+/*
+Copyright 2019 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"time"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	rest "k8s.io/client-go/rest"
+	v1alpha1 "knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+	scheme "knative.dev/eventing/pkg/client/clientset/versioned/scheme"
+)
+
+// TriggersGetter has a method to return a TriggerInterface.
+// A group's client should implement this interface.
+type TriggersGetter interface {
+	Triggers(namespace string) TriggerInterface
+}
+
+// TriggerInterface has methods to work with Trigger resources.
+type TriggerInterface interface {
+	Create(*v1alpha1.Trigger) (*v1alpha1.Trigger, error)
+	Update(*v1alpha1.Trigger) (*v1alpha1.Trigger, error)
+	UpdateStatus(*v1alpha1.Trigger) (*v1alpha1.Trigger, error)
+	Delete(name string, options *v1.DeleteOptions) error
+	DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
+	Get(name string, options v1.GetOptions) (*v1alpha1.Trigger, error)
+	List(opts v1.ListOptions) (*v1alpha1.TriggerList, error)
+	Watch(opts v1.ListOptions) (watch.Interface, error)
+	Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Trigger, err error)
+	TriggerExpansion
+}
+
+// triggers implements TriggerInterface
+type triggers struct {
+	client rest.Interface
+	ns     string
+}
+
+// newTriggers returns a Triggers
+func newTriggers(c *EventingV1alpha1Client, namespace string) *triggers {
+	return &triggers{
+		client: c.RESTClient(),
+		ns:     namespace,
+	}
+}
+
+// Get takes name of the trigger, and returns the corresponding trigger object, and an error if there is any.
+func (c *triggers) Get(name string, options v1.GetOptions) (result *v1alpha1.Trigger, err error) {
+	result = &v1alpha1.Trigger{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("triggers").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do().
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of Triggers that match those selectors.
+func (c *triggers) List(opts v1.ListOptions) (result *v1alpha1.TriggerList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.TriggerList{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("triggers").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do().
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested triggers.
+func (c *triggers) Watch(opts v1.ListOptions) (watch.Interface, error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	opts.Watch = true
+	return c.client.Get().
+		Namespace(c.ns).
+		Resource("triggers").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch()
+}
+
+// Create takes the representation of a trigger and creates it.  Returns the server's representation of the trigger, and an error, if there is any.
+func (c *triggers) Create(trigger *v1alpha1.Trigger) (result *v1alpha1.Trigger, err error) {
+	result = &v1alpha1.Trigger{}
+	err = c.client.Post().
+		Namespace(c.ns).
+		Resource("triggers").
+		Body(trigger).
+		Do().
+		Into(result)
+	return
+}
+
+// Update takes the representation of a trigger and updates it. Returns the server's representation of the trigger, and an error, if there is any.
+func (c *triggers) Update(trigger *v1alpha1.Trigger) (result *v1alpha1.Trigger, err error) {
+	result = &v1alpha1.Trigger{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("triggers").
+		Name(trigger.Name).
+		Body(trigger).
+		Do().
+		Into(result)
+	return
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+
+func (c *triggers) UpdateStatus(trigger *v1alpha1.Trigger) (result *v1alpha1.Trigger, err error) {
+	result = &v1alpha1.Trigger{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("triggers").
+		Name(trigger.Name).
+		SubResource("status").
+		Body(trigger).
+		Do().
+		Into(result)
+	return
+}
+
+// Delete takes name of the trigger and deletes it. Returns an error if one occurs.
+func (c *triggers) Delete(name string, options *v1.DeleteOptions) error {
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("triggers").
+		Name(name).
+		Body(options).
+		Do().
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *triggers) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+	var timeout time.Duration
+	if listOptions.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second
+	}
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("triggers").
+		VersionedParams(&listOptions, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(options).
+		Do().
+		Error()
+}
+
+// Patch applies the patch and returns the patched trigger.
+func (c *triggers) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Trigger, err error) {
+	result = &v1alpha1.Trigger{}
+	err = c.client.Patch(pt).
+		Namespace(c.ns).
+		Resource("triggers").
+		SubResource(subresources...).
+		Name(name).
+		Body(data).
+		Do().
+		Into(result)
+	return
+}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 72b916bf..6b43b114 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -627,6 +627,8 @@ knative.dev/eventing/pkg/apis/messaging/v1alpha1
 knative.dev/eventing/pkg/apis/sources
 knative.dev/eventing/pkg/apis/sources/v1alpha1
 knative.dev/eventing/pkg/client/clientset/versioned/scheme
+knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1
+knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake
 knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1alpha1
 knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1alpha1/fake
 knative.dev/eventing/pkg/logging


Test patch:
diff --git a/pkg/eventing/sources/v1alpha1/apiserver_client_mock_test.go b/pkg/eventing/sources/v1alpha1/apiserver_client_mock_test.go
new file mode 100644
index 00000000..b7d68698
--- /dev/null
+++ b/pkg/eventing/sources/v1alpha1/apiserver_client_mock_test.go
@@ -0,0 +1,43 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package v1alpha1
+
+import (
+	"testing"
+
+	"knative.dev/eventing/pkg/apis/sources/v1alpha1"
+)
+
+func TestMockKnAPIServerSourceClient(t *testing.T) {
+
+	client := NewMockKnAPIServerSourceClient(t)
+
+	recorder := client.Recorder()
+
+	// Record all services
+	recorder.GetAPIServerSource("hello", nil, nil)
+	recorder.CreateAPIServerSource(&v1alpha1.ApiServerSource{}, nil)
+	recorder.UpdateAPIServerSource(&v1alpha1.ApiServerSource{}, nil)
+	recorder.DeleteAPIServerSource("hello", nil)
+
+	// Call all service
+	client.GetAPIServerSource("hello")
+	client.CreateAPIServerSource(&v1alpha1.ApiServerSource{})
+	client.UpdateAPIServerSource(&v1alpha1.ApiServerSource{})
+	client.DeleteAPIServerSource("hello")
+
+	// Validate
+	recorder.Validate()
+}
diff --git a/pkg/eventing/sources/v1alpha1/apiserver_client_test.go b/pkg/eventing/sources/v1alpha1/apiserver_client_test.go
index 225f61ae..fd149d6b 100644
--- a/pkg/eventing/sources/v1alpha1/apiserver_client_test.go
+++ b/pkg/eventing/sources/v1alpha1/apiserver_client_test.go
@@ -19,90 +19,117 @@ import (
 	"testing"
 
 	"gotest.tools/assert"
+	v1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	client_testing "k8s.io/client-go/testing"
 	"knative.dev/eventing/pkg/apis/sources/v1alpha1"
 	"knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1alpha1/fake"
+	"knative.dev/pkg/apis/duck/v1beta1"
 )
 
-var testApiServerSourceNamespace = "test-ns"
+var testAPIServerSourceNamespace = "test-ns"
 
-func setupApiServerSourcesClient() (fakeSources fake.FakeSourcesV1alpha1, client KnApiServerSourcesClient) {
+func setupAPIServerSourcesClient(t *testing.T) (fakeSources fake.FakeSourcesV1alpha1, client KnAPIServerSourcesClient) {
 	fakeSources = fake.FakeSourcesV1alpha1{Fake: &client_testing.Fake{}}
-	client = NewKnSourcesClient(&fakeSources, testApiServerSourceNamespace).ApiServerSourcesClient()
+	client = NewKnSourcesClient(&fakeSources, testAPIServerSourceNamespace).APIServerSourcesClient()
+	assert.Equal(t, client.Namespace(), testAPIServerSourceNamespace)
 	return
 }
 
 func TestDeleteApiServerSource(t *testing.T) {
-	var srcName = "new-src"
-	sourcesServer, client := setupApiServerSourcesClient()
+	sourcesServer, client := setupAPIServerSourcesClient(t)
 
-	apisourceNew := newApiServerSource(srcName)
+	sourcesServer.AddReactor("delete", "apiserversources",
+		func(a client_testing.Action) (bool, runtime.Object, error) {
+			name := a.(client_testing.DeleteAction).GetName()
+			if name == "errorSource" {
+				return true, nil, fmt.Errorf("error while deleting ApiServer source %s", name)
+			}
+			return true, nil, nil
+		})
+
+	err := client.DeleteAPIServerSource("foo")
+	assert.NilError(t, err)
+
+	err = client.DeleteAPIServerSource("errorSource")
+	assert.ErrorContains(t, err, "errorSource")
+}
+
+func TestCreateApiServerSource(t *testing.T) {
+	sourcesServer, client := setupAPIServerSourcesClient(t)
 
 	sourcesServer.AddReactor("create", "apiserversources",
 		func(a client_testing.Action) (bool, runtime.Object, error) {
-			assert.Equal(t, testApiServerSourceNamespace, a.GetNamespace())
-			name := a.(client_testing.CreateAction).GetObject().(metav1.Object).GetName()
-			if name == apisourceNew.Name {
-				apisourceNew.Generation = 2
-				return true, apisourceNew, nil
+			newSource := a.(client_testing.CreateAction).GetObject()
+			name := newSource.(metav1.Object).GetName()
+			if name == "errorSource" {
+				return true, nil, fmt.Errorf("error while creating ApiServer source %s", name)
 			}
-			return true, nil, fmt.Errorf("error while creating apiserversource %s", name)
+			return true, newSource, nil
 		})
+	err := client.CreateAPIServerSource(newAPIServerSource("foo", "Event"))
+	assert.NilError(t, err)
+
+	err = client.CreateAPIServerSource(newAPIServerSource("errorSource", "Event"))
+	assert.ErrorContains(t, err, "errorSource")
 
-	t.Run("create apiserversource without error", func(t *testing.T) {
-		ins, err := client.CreateApiServerSource(apisourceNew)
-		assert.NilError(t, err)
-		assert.Equal(t, ins.Name, srcName)
-		assert.Equal(t, ins.Namespace, testApiServerSourceNamespace)
-	})
-
-	t.Run("create apiserversource with an error returns an error object", func(t *testing.T) {
-		_, err := client.CreateApiServerSource(newApiServerSource("unknown"))
-		assert.ErrorContains(t, err, "unknown")
-	})
 }
 
-func TestCreateApiServerSource(t *testing.T) {
-	var srcName = "new-src"
-	sourcesServer, client := setupApiServerSourcesClient()
+func TestGetApiServerSource(t *testing.T) {
+	sourcesServer, client := setupAPIServerSourcesClient(t)
+
+	sourcesServer.AddReactor("get", "apiserversources",
+		func(a client_testing.Action) (bool, runtime.Object, error) {
+			name := a.(client_testing.GetAction).GetName()
+			if name == "errorSource" {
+				return true, nil, fmt.Errorf("error while getting ApiServer source %s", name)
+			}
+			return true, newAPIServerSource(name, "Event"), nil
+		})
+	testsource, err := client.GetAPIServerSource("foo")
+	assert.NilError(t, err)
+	assert.Equal(t, testsource.Name, "foo")
+	assert.Equal(t, testsource.Spec.Sink.Ref.Name, "foosvc")
+
+	_, err = client.GetAPIServerSource("errorSource")
+	assert.ErrorContains(t, err, "errorSource")
+}
 
-	apisourceNew := newApiServerSource(srcName)
+func TestUpdateApiServerSource(t *testing.T) {
+	sourcesServer, client := setupAPIServerSourcesClient(t)
 
-	sourcesServer.AddReactor("create", "apiserversources",
+	sourcesServer.AddReactor("update", "apiserversources",
 		func(a client_testing.Action) (bool, runtime.Object, error) {
-			assert.Equal(t, testApiServerSourceNamespace, a.GetNamespace())
-			name := a.(client_testing.CreateAction).GetObject().(metav1.Object).GetName()
-			if name == apisourceNew.Name {
-				apisourceNew.Generation = 2
-				return true, apisourceNew, nil
+			updatedSource := a.(client_testing.UpdateAction).GetObject()
+			name := updatedSource.(metav1.Object).GetName()
+			if name == "errorSource" {
+				return true, nil, fmt.Errorf("error while updating ApiServer source %s", name)
 			}
-			return true, nil, fmt.Errorf("error while creating apiserversource %s", name)
+			return true, NewAPIServerSourceBuilderFromExisting(updatedSource.(*v1alpha1.ApiServerSource)).Build(), nil
 		})
+	err := client.UpdateAPIServerSource(newAPIServerSource("foo", "Event"))
+	assert.NilError(t, err)
 
-	t.Run("create apiserversource without error", func(t *testing.T) {
-		ins, err := client.CreateApiServerSource(apisourceNew)
-		assert.NilError(t, err)
-		assert.Equal(t, ins.Name, srcName)
-		assert.Equal(t, ins.Namespace, testApiServerSourceNamespace)
-	})
-
-	t.Run("create apiserversource with an error returns an error object", func(t *testing.T) {
-		_, err := client.CreateApiServerSource(newApiServerSource("unknown"))
-		assert.ErrorContains(t, err, "unknown")
-	})
+	err = client.UpdateAPIServerSource(newAPIServerSource("errorSource", "Event"))
+	assert.ErrorContains(t, err, "errorSource")
 }
 
-func newApiServerSource(name string) *v1alpha1.ApiServerSource {
-	src := &v1alpha1.ApiServerSource{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      name,
-			Namespace: testApiServerSourceNamespace,
-		},
+func newAPIServerSource(name, resource string) *v1alpha1.ApiServerSource {
+	b := NewAPIServerSourceBuilder(name).ServiceAccount("testsa").Mode("Ref")
+	b.Sink(&v1beta1.Destination{
+		Ref: &v1.ObjectReference{
+			Kind: "Service",
+			Name: "foosvc",
+		}})
+
+	if resource != "" {
+		b.Resources([]v1alpha1.ApiServerResource{{
+			APIVersion: "v1",
+			Kind:       resource,
+			Controller: false,
+		}})
 	}
-	src.Name = name
-	src.Namespace = testApiServerSourceNamespace
-	return src
+	return b.Build()
 }
diff --git a/pkg/eventing/sources/v1alpha1/cronjob_client_mock_test.go b/pkg/eventing/sources/v1alpha1/cronjob_client_mock_test.go
index 5e835c0e..d2b54a5f 100644
--- a/pkg/eventing/sources/v1alpha1/cronjob_client_mock_test.go
+++ b/pkg/eventing/sources/v1alpha1/cronjob_client_mock_test.go
@@ -20,7 +20,7 @@ import (
 	"knative.dev/eventing/pkg/apis/sources/v1alpha1"
 )
 
-func TestMockKnClient(t *testing.T) {
+func TestMockKnCronJobSourceClient(t *testing.T) {
 
 	client := NewMockKnCronJobSourceClient(t)
 
diff --git a/pkg/eventing/v1alpha1/client_mock_test.go b/pkg/eventing/v1alpha1/client_mock_test.go
new file mode 100644
index 00000000..bfff269d
--- /dev/null
+++ b/pkg/eventing/v1alpha1/client_mock_test.go
@@ -0,0 +1,41 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package v1alpha1
+
+import (
+	"testing"
+
+	"knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+)
+
+func TestMockKnClient(t *testing.T) {
+
+	client := NewMockKnEventingClient(t)
+
+	recorder := client.Recorder()
+
+	// Record all services
+	recorder.GetTrigger("hello", nil, nil)
+	recorder.CreateTrigger(&v1alpha1.Trigger{}, nil)
+	recorder.DeleteTrigger("hello", nil)
+
+	// Call all service
+	client.GetTrigger("hello")
+	client.CreateTrigger(&v1alpha1.Trigger{})
+	client.DeleteTrigger("hello")
+
+	// Validate
+	recorder.Validate()
+}
diff --git a/pkg/eventing/v1alpha1/client_test.go b/pkg/eventing/v1alpha1/client_test.go
new file mode 100644
index 00000000..00c94cc1
--- /dev/null
+++ b/pkg/eventing/v1alpha1/client_test.go
@@ -0,0 +1,128 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package v1alpha1
+
+import (
+	"fmt"
+	"testing"
+
+	"gotest.tools/assert"
+	"k8s.io/apimachinery/pkg/runtime"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	client_testing "k8s.io/client-go/testing"
+	"knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+	"knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake"
+)
+
+var testNamespace = "test-ns"
+
+func setup() (fakeSvr fake.FakeEventingV1alpha1, client KnEventingClient) {
+	fakeE := fake.FakeEventingV1alpha1{Fake: &client_testing.Fake{}}
+	cli := NewKnEventingClient(&fakeE, testNamespace)
+	return fakeE, cli
+}
+
+func TestDeleteTrigger(t *testing.T) {
+	var name = "new-trigger"
+	server, client := setup()
+
+	server.AddReactor("delete", "triggers",
+		func(a client_testing.Action) (bool, runtime.Object, error) {
+			name := a.(client_testing.DeleteAction).GetName()
+			if name == "errorTrigger" {
+				return true, nil, fmt.Errorf("error while deleting trigger %s", name)
+			}
+			return true, nil, nil
+		})
+
+	err := client.DeleteTrigger(name)
+	assert.NilError(t, err)
+
+	err = client.DeleteTrigger("errorTrigger")
+	assert.ErrorContains(t, err, "errorTrigger")
+}
+
+func TestCreateTrigger(t *testing.T) {
+	var name = "new-trigger"
+	server, client := setup()
+
+	objNew := newTrigger(name)
+
+	server.AddReactor("create", "triggers",
+		func(a client_testing.Action) (bool, runtime.Object, error) {
+			assert.Equal(t, testNamespace, a.GetNamespace())
+			name := a.(client_testing.CreateAction).GetObject().(metav1.Object).GetName()
+			if name == objNew.Name {
+				objNew.Generation = 2
+				return true, objNew, nil
+			}
+			return true, nil, fmt.Errorf("error while creating trigger %s", name)
+		})
+
+	t.Run("create trigger without error", func(t *testing.T) {
+		ins, err := client.CreateTrigger(objNew)
+		assert.NilError(t, err)
+		assert.Equal(t, ins.Name, name)
+		assert.Equal(t, ins.Namespace, testNamespace)
+	})
+
+	t.Run("create trigger with an error returns an error object", func(t *testing.T) {
+		_, err := client.CreateTrigger(newTrigger("unknown"))
+		assert.ErrorContains(t, err, "unknown")
+	})
+}
+
+func TestGetTrigger(t *testing.T) {
+	var name = "mytrigger"
+	server, client := setup()
+
+	server.AddReactor("get", "triggers",
+		func(a client_testing.Action) (bool, runtime.Object, error) {
+			name := a.(client_testing.GetAction).GetName()
+			if name == "errorTrigger" {
+				return true, nil, fmt.Errorf("error while getting trigger %s", name)
+			}
+			return true, newTrigger(name), nil
+		})
+
+	trigger, err := client.GetTrigger(name)
+	assert.NilError(t, err)
+	assert.Equal(t, trigger.Name, name)
+	assert.Equal(t, trigger.Spec.Broker, "default")
+
+	_, err = client.GetTrigger("errorTrigger")
+	assert.ErrorContains(t, err, "errorTrigger")
+}
+
+func newTrigger(name string) *v1alpha1.Trigger {
+	obj := &v1alpha1.Trigger{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      name,
+			Namespace: testNamespace,
+		},
+		Spec: v1alpha1.TriggerSpec{
+			Broker: "default",
+			Filter: &v1alpha1.TriggerFilter{
+				Attributes: &v1alpha1.TriggerFilterAttributes{
+					"type": "foo",
+				},
+			},
+		},
+	}
+	obj.Name = name
+	obj.Namespace = testNamespace
+	return obj
+}
diff --git a/pkg/kn/commands/source/apiserver/apiserver_test.go b/pkg/kn/commands/source/apiserver/apiserver_test.go
new file mode 100644
index 00000000..09777f24
--- /dev/null
+++ b/pkg/kn/commands/source/apiserver/apiserver_test.go
@@ -0,0 +1,105 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package apiserver
+
+import (
+	"bytes"
+
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/client-go/tools/clientcmd"
+	"knative.dev/eventing/pkg/apis/sources/v1alpha1"
+	duckv1beta1 "knative.dev/pkg/apis/duck/v1beta1"
+
+	knsource_v1alpha1 "knative.dev/client/pkg/eventing/sources/v1alpha1"
+	"knative.dev/client/pkg/kn/commands"
+	knserving_v1alpha1 "knative.dev/client/pkg/serving/v1alpha1"
+)
+
+const testNamespace = "default"
+
+// Helper methods
+var blankConfig clientcmd.ClientConfig
+
+// TOOD: Remove that blankConfig hack for tests in favor of overwriting GetConfig()
+func init() {
+	var err error
+	blankConfig, err = clientcmd.NewClientConfigFromBytes([]byte(`kind: Config
+version: v1
+users:
+- name: u
+clusters:
+- name: c
+  cluster:
+    server: example.com
+contexts:
+- name: x
+  context:
+    user: u
+    cluster: c
+current-context: x
+`))
+	if err != nil {
+		panic(err)
+	}
+}
+
+func executeAPIServerSourceCommand(apiServerSourceClient knsource_v1alpha1.KnAPIServerSourcesClient, servingClient knserving_v1alpha1.KnServingClient, args ...string) (string, error) {
+	knParams := &commands.KnParams{}
+	knParams.ClientConfig = blankConfig
+
+	output := new(bytes.Buffer)
+	knParams.Output = output
+	knParams.NewServingClient = func(namespace string) (knserving_v1alpha1.KnServingClient, error) {
+		return servingClient, nil
+	}
+
+	cmd := NewAPIServerCommand(knParams)
+	cmd.SetArgs(args)
+	cmd.SetOutput(output)
+
+	apiServerSourceClientFactory = func(config clientcmd.ClientConfig, namespace string) (knsource_v1alpha1.KnAPIServerSourcesClient, error) {
+		return apiServerSourceClient, nil
+	}
+	defer cleanupAPIServerMockClient()
+
+	err := cmd.Execute()
+
+	return output.String(), err
+}
+
+func cleanupAPIServerMockClient() {
+	apiServerSourceClientFactory = nil
+}
+
+func createAPIServerSource(name, resourceKind, resourceVersion, serviceAccount, mode, service string, isController bool) *v1alpha1.ApiServerSource {
+	resources := []v1alpha1.ApiServerResource{{
+		APIVersion: resourceVersion,
+		Kind:       resourceKind,
+		Controller: isController,
+	}}
+
+	sink := &duckv1beta1.Destination{
+		Ref: &corev1.ObjectReference{
+			Kind: "Service",
+			Name: service,
+		}}
+
+	return knsource_v1alpha1.NewAPIServerSourceBuilder(name).
+		Resources(resources).
+		ServiceAccount(serviceAccount).
+		Mode(mode).
+		Sink(sink).
+		Build()
+}
diff --git a/pkg/kn/commands/source/apiserver/create_flag_test.go b/pkg/kn/commands/source/apiserver/create_flag_test.go
index 3db94d99..6cf9dff0 100644
--- a/pkg/kn/commands/source/apiserver/create_flag_test.go
+++ b/pkg/kn/commands/source/apiserver/create_flag_test.go
@@ -21,14 +21,14 @@ import (
 	sources_v1alpha1 "knative.dev/eventing/pkg/apis/sources/v1alpha1"
 )
 
-func TestGetApiServerResourceArray(t *testing.T) {
+func TestGetAPIServerResourceArray(t *testing.T) {
 	t.Run("get single apiserver resource", func(t *testing.T) {
-		createFlag := ApiServerSourceUpdateFlags{
+		createFlag := APIServerSourceUpdateFlags{
 			ServiceAccountName: "test-sa",
 			Mode:               "Ref",
 			Resources:          []string{"Service:serving.knative.dev/v1alpha1:true"},
 		}
-		created := createFlag.GetApiServerResourceArray()
+		created := createFlag.GetAPIServerResourceArray()
 		wanted := []sources_v1alpha1.ApiServerResource{{
 			APIVersion: "serving.knative.dev/v1alpha1",
 			Kind:       "Service",
@@ -37,12 +37,12 @@ func TestGetApiServerResourceArray(t *testing.T) {
 		assert.DeepEqual(t, wanted, created)
 
 		// default isController
-		createFlag = ApiServerSourceUpdateFlags{
+		createFlag = APIServerSourceUpdateFlags{
 			ServiceAccountName: "test-sa",
 			Mode:               "Ref",
 			Resources:          []string{"Service:serving.knative.dev/v1alpha1"},
 		}
-		created = createFlag.GetApiServerResourceArray()
+		created = createFlag.GetAPIServerResourceArray()
 		wanted = []sources_v1alpha1.ApiServerResource{{
 			APIVersion: "serving.knative.dev/v1alpha1",
 			Kind:       "Service",
@@ -51,12 +51,12 @@ func TestGetApiServerResourceArray(t *testing.T) {
 		assert.DeepEqual(t, wanted, created)
 
 		// default api version and isController
-		createFlag = ApiServerSourceUpdateFlags{
+		createFlag = APIServerSourceUpdateFlags{
 			ServiceAccountName: "test-sa",
 			Mode:               "Ref",
 			Resources:          []string{"Service"},
 		}
-		created = createFlag.GetApiServerResourceArray()
+		created = createFlag.GetAPIServerResourceArray()
 		wanted = []sources_v1alpha1.ApiServerResource{{
 			APIVersion: "v1",
 			Kind:       "Service",
@@ -66,12 +66,12 @@ func TestGetApiServerResourceArray(t *testing.T) {
 	})
 
 	t.Run("get multiple apiserver resources", func(t *testing.T) {
-		createFlag := ApiServerSourceUpdateFlags{
+		createFlag := APIServerSourceUpdateFlags{
 			ServiceAccountName: "test-sa",
 			Mode:               "Resource",
 			Resources:          []string{"Event:v1:true", "Pod:v2:false"},
 		}
-		created := createFlag.GetApiServerResourceArray()
+		created := createFlag.GetAPIServerResourceArray()
 		wanted := []sources_v1alpha1.ApiServerResource{{
 			APIVersion: "v1",
 			Kind:       "Event",
@@ -84,12 +84,12 @@ func TestGetApiServerResourceArray(t *testing.T) {
 		assert.DeepEqual(t, wanted, created)
 
 		// default api version and isController
-		createFlag = ApiServerSourceUpdateFlags{
+		createFlag = APIServerSourceUpdateFlags{
 			ServiceAccountName: "test-sa",
 			Mode:               "Resource",
 			Resources:          []string{"Event", "Pod"},
 		}
-		created = createFlag.GetApiServerResourceArray()
+		created = createFlag.GetAPIServerResourceArray()
 
 		wanted = []sources_v1alpha1.ApiServerResource{{
 			APIVersion: "v1",
diff --git a/pkg/kn/commands/source/apiserver/create_test.go b/pkg/kn/commands/source/apiserver/create_test.go
index eabda081..fb05be64 100644
--- a/pkg/kn/commands/source/apiserver/create_test.go
+++ b/pkg/kn/commands/source/apiserver/create_test.go
@@ -16,87 +16,48 @@ package apiserver
 
 import (
 	"errors"
-	"fmt"
 	"testing"
 
 	"gotest.tools/assert"
-	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
-	client_testing "k8s.io/client-go/testing"
-	"knative.dev/client/pkg/kn/commands"
+	knsources_v1alpha1 "knative.dev/client/pkg/eventing/sources/v1alpha1"
+	knserving_client "knative.dev/client/pkg/serving/v1alpha1"
 	"knative.dev/client/pkg/util"
-	"knative.dev/eventing/pkg/apis/sources/v1alpha1"
-	duckv1beta1 "knative.dev/pkg/apis/duck/v1beta1"
+	serving_v1alpha1 "knative.dev/serving/pkg/apis/serving/v1alpha1"
 )
 
-var (
-	testApiServerSrcName = "foo"
-)
+func TestCreateApiServerSource(t *testing.T) {
+
+	apiServerClient := knsources_v1alpha1.NewMockKnAPIServerSourceClient(t)
+	servingClient := knserving_client.NewMockKnServiceClient(t)
+
+	servingRecorder := servingClient.Recorder()
+	servingRecorder.GetService("testsvc", &serving_v1alpha1.Service{
+		TypeMeta:   metav1.TypeMeta{Kind: "Service"},
+		ObjectMeta: metav1.ObjectMeta{Name: "testsvc"},
+	}, nil)
+
+	apiServerRecorder := apiServerClient.Recorder()
+	apiServerRecorder.CreateAPIServerSource(createAPIServerSource("testsource", "Event", "v1", "testsa", "Ref", "testsvc", false), nil)
+
+	out, err := executeAPIServerSourceCommand(apiServerClient, servingClient, "create", "testsource", "--resource", "Event:v1:false", "--service-account", "testsa", "--sink", "svc:testsvc", "--mode", "Ref")
+	assert.NilError(t, err, "ApiServer source should be created")
+	util.ContainsAll(out, "created", "default", "testsource")
 
-func fakeApiServerSourceCreate(args []string, withExistingService bool, sync bool) (
-	action client_testing.Action,
-	src *v1alpha1.ApiServerSource,
-	output string,
-	err error) {
-	knParams := &commands.KnParams{}
-	cmd, fakeSource, buf := commands.CreateSourcesTestKnCommand(NewApiServerCommand(knParams), knParams)
-	fakeSource.AddReactor("create", "apiserversources",
-		func(a client_testing.Action) (bool, runtime.Object, error) {
-			createAction, ok := a.(client_testing.CreateAction)
-			action = createAction
-			if !ok {
-				return true, nil, fmt.Errorf("wrong kind of action %v", a)
-			}
-			src, ok = createAction.GetObject().(*v1alpha1.ApiServerSource)
-			if !ok {
-				return true, nil, errors.New("was passed the wrong object")
-			}
-			return true, src, nil
-		})
-	cmd.SetArgs(args)
-	err = cmd.Execute()
-	if err != nil {
-		output = err.Error()
-		return
-	}
-	output = buf.String()
-	return
+	apiServerRecorder.Validate()
+	servingRecorder.Validate()
 }
 
-func TestApiServerSourceCreate(t *testing.T) {
-	action, created, output, err := fakeApiServerSourceCreate([]string{
-		"apiserver", "create", testApiServerSrcName, "--resource", "Event:v1:true", "--service-account", "myaccountname", "--sink", "svc:mysvc"}, true, false)
-	if err != nil {
-		t.Fatal(err)
-	} else if !action.Matches("create", "apiserversources") {
-		t.Fatalf("Bad action %v", action)
-	}
+func TestNoSinkError(t *testing.T) {
+	servingClient := knserving_client.NewMockKnServiceClient(t)
+	apiServerClient := knsources_v1alpha1.NewMockKnAPIServerSourceClient(t)
 
-	//construct a wanted instance
-	wanted := &v1alpha1.ApiServerSource{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      testApiServerSrcName,
-			Namespace: commands.FakeNamespace,
-		},
-		Spec: v1alpha1.ApiServerSourceSpec{
-			Resources: []v1alpha1.ApiServerResource{{
-				APIVersion: "v1",
-				Kind:       "Event",
-				Controller: true,
-			}},
-			ServiceAccountName: "myaccountname",
-			Mode:               "Ref",
-			Sink: &duckv1beta1.Destination{
-				Ref: &v1.ObjectReference{
-					Kind:       "Service",
-					APIVersion: "serving.knative.dev/v1alpha1",
-				},
-			},
-		},
-	}
+	errorMsg := "cannot create ApiServerSource 'testsource' in namespace 'default' because no Service svc found"
+	servingRecorder := servingClient.Recorder()
+	servingRecorder.GetService("testsvc", nil, errors.New("no Service svc found"))
 
-	//assert equal
-	assert.DeepEqual(t, wanted, created)
-	assert.Check(t, util.ContainsAll(output, "ApiServerSource", testApiServerSrcName, "created", "namespace", commands.FakeNamespace))
+	out, err := executeAPIServerSourceCommand(apiServerClient, servingClient, "create", "testsource", "--resource", "Event:v1:false", "--service-account", "testsa", "--sink", "svc:testsvc", "--mode", "Ref")
+	assert.Error(t, err, errorMsg)
+	assert.Assert(t, util.ContainsAll(out, errorMsg, "Usage"))
+	servingRecorder.Validate()
 }
diff --git a/pkg/kn/commands/source/apiserver/delete_test.go b/pkg/kn/commands/source/apiserver/delete_test.go
index 0b2603f3..5d238114 100644
--- a/pkg/kn/commands/source/apiserver/delete_test.go
+++ b/pkg/kn/commands/source/apiserver/delete_test.go
@@ -15,47 +15,39 @@
 package apiserver
 
 import (
+	"errors"
 	"testing"
 
 	"gotest.tools/assert"
-	"k8s.io/apimachinery/pkg/runtime"
-	client_testing "k8s.io/client-go/testing"
-	"knative.dev/client/pkg/kn/commands"
+
+	knsources_v1alpha1 "knative.dev/client/pkg/eventing/sources/v1alpha1"
 	"knative.dev/client/pkg/util"
 )
 
-func fakeServiceDelete(args []string) (action client_testing.Action, name string, output string, err error) {
-	knParams := &commands.KnParams{}
-	cmd, fakeSource, buf := commands.CreateSourcesTestKnCommand(NewApiServerCommand(knParams), knParams)
-	fakeSource.AddReactor("delete", "apiserversources",
-		func(a client_testing.Action) (bool, runtime.Object, error) {
-			deleteAction, _ := a.(client_testing.DeleteAction)
-			action = deleteAction
-			name = deleteAction.GetName()
-			return true, nil, nil
-		})
-	cmd.SetArgs(args)
-	err = cmd.Execute()
-	if err != nil {
-		return
-	}
-	output = buf.String()
-	return
+func TestApiServerSourceDelete(t *testing.T) {
+
+	apiServerClient := knsources_v1alpha1.NewMockKnAPIServerSourceClient(t, "testns")
+	apiServerRecorder := apiServerClient.Recorder()
+
+	apiServerRecorder.DeleteAPIServerSource("testsource", nil)
+
+	out, err := executeAPIServerSourceCommand(apiServerClient, nil, "delete", "testsource")
+	assert.NilError(t, err)
+	util.ContainsAll(out, "deleted", "testns", "testsource")
+
+	apiServerRecorder.Validate()
 }
 
-func TestServiceDelete(t *testing.T) {
-	srcName := "src-12345"
-	action, name, output, err := fakeServiceDelete([]string{"apiserver", "delete", srcName})
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	if action == nil {
-		t.Errorf("No action")
-	} else if !action.Matches("delete", "apiserversources") {
-		t.Errorf("Bad action %v", action)
-	} else if name != srcName {
-		t.Errorf("Bad service name returned after delete.")
-	}
-	assert.Check(t, util.ContainsAll(output, "ApiServerSource", srcName, "deleted", "namespace", commands.FakeNamespace))
+func TestDeleteWithError(t *testing.T) {
+
+	apiServerClient := knsources_v1alpha1.NewMockKnAPIServerSourceClient(t, "mynamespace")
+	apiServerRecorder := apiServerClient.Recorder()
+
+	apiServerRecorder.DeleteAPIServerSource("testsource", errors.New("apiserver source testsource not found"))
+
+	out, err := executeAPIServerSourceCommand(apiServerClient, nil, "delete", "testsource")
+	assert.ErrorContains(t, err, "testsource")
+	util.ContainsAll(out, "apiserver", "source", "testsource", "not found")
+
+	apiServerRecorder.Validate()
 }
diff --git a/pkg/kn/commands/source/apiserver/describe_test.go b/pkg/kn/commands/source/apiserver/describe_test.go
new file mode 100644
index 00000000..6d8ed00c
--- /dev/null
+++ b/pkg/kn/commands/source/apiserver/describe_test.go
@@ -0,0 +1,52 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package apiserver
+
+import (
+	"errors"
+	"testing"
+
+	"gotest.tools/assert"
+
+	knsource_v1alpha1 "knative.dev/client/pkg/eventing/sources/v1alpha1"
+	"knative.dev/client/pkg/util"
+)
+
+func TestSimpleDescribe(t *testing.T) {
+	apiServerClient := knsource_v1alpha1.NewMockKnAPIServerSourceClient(t, "mynamespace")
+
+	apiServerRecorder := apiServerClient.Recorder()
+	sampleSource := createAPIServerSource("testsource", "Event", "v1", "testsa", "Ref", "testsvc", false)
+	apiServerRecorder.GetAPIServerSource("testsource", sampleSource, nil)
+
+	out, err := executeAPIServerSourceCommand(apiServerClient, nil, "describe", "testsource")
+	assert.NilError(t, err)
+	util.ContainsAll(out, "testsource", "testsa", "Ref", "testsvc", "Service", "Resources", "Event", "v1", "false", "Conditions")
+
+	apiServerRecorder.Validate()
+}
+
+func TestDescribeError(t *testing.T) {
+	apiServerClient := knsource_v1alpha1.NewMockKnAPIServerSourceClient(t, "mynamespace")
+
+	apiServerRecorder := apiServerClient.Recorder()
+	apiServerRecorder.GetAPIServerSource("testsource", nil, errors.New("no apiserver source testsource"))
+
+	out, err := executeAPIServerSourceCommand(apiServerClient, nil, "describe", "testsource")
+	assert.ErrorContains(t, err, "testsource")
+	util.ContainsAll(out, "Usage", "testsource")
+
+	apiServerRecorder.Validate()
+}
diff --git a/pkg/kn/commands/source/apiserver/update_test.go b/pkg/kn/commands/source/apiserver/update_test.go
new file mode 100644
index 00000000..a8df007a
--- /dev/null
+++ b/pkg/kn/commands/source/apiserver/update_test.go
@@ -0,0 +1,54 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package apiserver
+
+import (
+	"testing"
+
+	"gotest.tools/assert"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	serving_v1alpha1 "knative.dev/serving/pkg/apis/serving/v1alpha1"
+
+	knsources_v1alpha1 "knative.dev/client/pkg/eventing/sources/v1alpha1"
+	knserving_client "knative.dev/client/pkg/serving/v1alpha1"
+	"knative.dev/client/pkg/util"
+)
+
+func TestApiServerSourceUpdate(t *testing.T) {
+	apiServerClient := knsources_v1alpha1.NewMockKnAPIServerSourceClient(t)
+	servingClient := knserving_client.NewMockKnServiceClient(t)
+
+	apiServerRecorder := apiServerClient.Recorder()
+	servingRecorder := servingClient.Recorder()
+
+	present := createAPIServerSource("testsource", "Event", "v1", "testsa1", "Ref", "svc1", false)
+	apiServerRecorder.GetAPIServerSource("testsource", present, nil)
+
+	servingRecorder.GetService("svc2", &serving_v1alpha1.Service{
+		TypeMeta:   metav1.TypeMeta{Kind: "Service"},
+		ObjectMeta: metav1.ObjectMeta{Name: "svc2"},
+	}, nil)
+
+	updated := createAPIServerSource("testsource", "Event", "v1", "testsa2", "Ref", "svc2", false)
+	apiServerRecorder.UpdateAPIServerSource(updated, nil)
+
+	output, err := executeAPIServerSourceCommand(apiServerClient, servingClient, "update", "testsource", "--service-account", "testsa2", "--sink", "svc:svc2")
+	assert.NilError(t, err)
+	assert.Assert(t, util.ContainsAll(output, "testsource", "updated", "default"))
+
+	apiServerRecorder.Validate()
+	servingRecorder.Validate()
+}
diff --git a/pkg/kn/commands/testing_helper.go b/pkg/kn/commands/testing_helper.go
index 3ecae773..528e3a00 100644
--- a/pkg/kn/commands/testing_helper.go
+++ b/pkg/kn/commands/testing_helper.go
@@ -33,6 +33,8 @@ import (
 	dynamic_fake "k8s.io/client-go/dynamic/fake"
 	dynamic_kn "knative.dev/client/pkg/dynamic"
 	sources_client "knative.dev/client/pkg/eventing/sources/v1alpha1"
+	eventing_client "knative.dev/client/pkg/eventing/v1alpha1"
+	eventing_fake "knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1alpha1/fake"
 	sources_fake "knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1alpha1/fake"
 )
 
@@ -78,6 +80,25 @@ func CreateSourcesTestKnCommand(cmd *cobra.Command, knParams *KnParams) (*cobra.
 	return knCommand, fakeEventing, buf
 }
 
+// CreateEventingTestKnCommand helper for creating test commands
+func CreateEventingTestKnCommand(cmd *cobra.Command, knParams *KnParams) (*cobra.Command, *eventing_fake.FakeEventingV1alpha1, *bytes.Buffer) {
+	buf := new(bytes.Buffer)
+	// create fake serving client because the sink of source depends on serving client
+	fakeServing := &fake.FakeServingV1alpha1{&client_testing.Fake{}}
+	knParams.NewServingClient = func(namespace string) (v1alpha1.KnServingClient, error) {
+		return v1alpha1.NewKnServingClient(fakeServing, FakeNamespace), nil
+	}
+	// create fake sources client
+	fakeEventing := &eventing_fake.FakeEventingV1alpha1{&client_testing.Fake{}}
+	knParams.Output = buf
+	knParams.NewEventingClient = func(namespace string) (eventing_client.KnEventingClient, error) {
+		return eventing_client.NewKnEventingClient(fakeEventing, FakeNamespace), nil
+	}
+	knParams.fixedCurrentNamespace = FakeNamespace
+	knCommand := NewKnTestCommand(cmd, knParams)
+	return knCommand, fakeEventing, buf
+}
+
 // CreateDynamicTestKnCommand helper for creating test commands using dynamic client
 func CreateDynamicTestKnCommand(cmd *cobra.Command, knParams *KnParams, objects ...runtime.Object) (*cobra.Command, *dynamic_fake.FakeDynamicClient, *bytes.Buffer) {
 	buf := new(bytes.Buffer)
diff --git a/pkg/kn/commands/trigger/create_test.go b/pkg/kn/commands/trigger/create_test.go
new file mode 100644
index 00000000..659a2688
--- /dev/null
+++ b/pkg/kn/commands/trigger/create_test.go
@@ -0,0 +1,117 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package trigger
+
+import (
+	"errors"
+	"fmt"
+	"testing"
+
+	"gotest.tools/assert"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	eventing_client "knative.dev/client/pkg/eventing/v1alpha1"
+	knserving_client "knative.dev/client/pkg/serving/v1alpha1"
+	"knative.dev/client/pkg/util"
+	"knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+	duckv1 "knative.dev/pkg/apis/duck/v1"
+	serving_v1alpha1 "knative.dev/serving/pkg/apis/serving/v1alpha1"
+)
+
+var (
+	triggerName = "foo"
+)
+
+func TestTriggerCreate(t *testing.T) {
+	eventingClient := eventing_client.NewMockKnEventingClient(t)
+	servingClient := knserving_client.NewMockKnServiceClient(t)
+
+	servingRecorder := servingClient.Recorder()
+	servingRecorder.GetService("mysvc", &serving_v1alpha1.Service{
+		TypeMeta:   metav1.TypeMeta{Kind: "Service"},
+		ObjectMeta: metav1.ObjectMeta{Name: "mysvc"},
+	}, nil)
+
+	eventingRecorder := eventingClient.Recorder()
+	eventingRecorder.CreateTrigger(createTrigger(triggerName, map[string]string{"type": "dev.knative.foo"}, "mybroker", "mysvc"), nil)
+
+	out, err := executeTriggerCommand(eventingClient, servingClient, "create", triggerName, "--broker", "mybroker",
+		"--filter", "type=dev.knative.foo", "--sink", "svc:mysvc")
+	assert.NilError(t, err, "Trigger should be created")
+	util.ContainsAll(out, "Trigger", triggerName, "created", "namespace", "default")
+
+	eventingRecorder.Validate()
+	servingRecorder.Validate()
+}
+
+func TestNoSinkError(t *testing.T) {
+	eventingClient := eventing_client.NewMockKnEventingClient(t)
+	servingClient := knserving_client.NewMockKnServiceClient(t)
+
+	errorMsg := fmt.Sprintf("cannot create trigger '%s' in namespace 'default' because no Service mysvc found", triggerName)
+	servingRecorder := servingClient.Recorder()
+	servingRecorder.GetService("mysvc", nil, errors.New("no Service mysvc found"))
+
+	out, err := executeTriggerCommand(eventingClient, servingClient, "create", triggerName, "--broker", "mybroker",
+		"--filter", "type=dev.knative.foo", "--sink", "svc:mysvc")
+	assert.Error(t, err, errorMsg)
+	assert.Assert(t, util.ContainsAll(out, errorMsg, "Usage"))
+	servingRecorder.Validate()
+}
+
+func TestTriggerCreateMultipleFilter(t *testing.T) {
+	eventingClient := eventing_client.NewMockKnEventingClient(t)
+	servingClient := knserving_client.NewMockKnServiceClient(t)
+
+	servingRecorder := servingClient.Recorder()
+	servingRecorder.GetService("mysvc", &serving_v1alpha1.Service{
+		TypeMeta:   metav1.TypeMeta{Kind: "Service"},
+		ObjectMeta: metav1.ObjectMeta{Name: "mysvc"},
+	}, nil)
+
+	eventingRecorder := eventingClient.Recorder()
+	eventingRecorder.CreateTrigger(createTrigger(triggerName, map[string]string{"type": "dev.knative.foo", "source": "event.host"}, "mybroker", "mysvc"), nil)
+
+	out, err := executeTriggerCommand(eventingClient, servingClient, "create", triggerName, "--broker", "mybroker",
+		"--filter", "type=dev.knative.foo", "--filter", "source=event.host", "--sink", "svc:mysvc")
+	assert.NilError(t, err, "Trigger should be created")
+	util.ContainsAll(out, "Trigger", triggerName, "created", "namespace", "default")
+
+	eventingRecorder.Validate()
+	servingRecorder.Validate()
+}
+
+func createTrigger(name string, filters map[string]string, broker string, svcname string) *v1alpha1.Trigger {
+	triggerFilterAttributes := v1alpha1.TriggerFilterAttributes(filters)
+	wanted := &v1alpha1.Trigger{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      name,
+			Namespace: "default",
+		},
+		Spec: v1alpha1.TriggerSpec{
+			Broker: broker,
+			Filter: &v1alpha1.TriggerFilter{
+				Attributes: &triggerFilterAttributes,
+			},
+			Subscriber: &duckv1.Destination{
+				Ref: &corev1.ObjectReference{
+					Name: svcname,
+					Kind: "Service",
+				},
+			},
+		},
+	}
+	return wanted
+}
diff --git a/pkg/kn/commands/trigger/delete_test.go b/pkg/kn/commands/trigger/delete_test.go
new file mode 100644
index 00000000..778a189f
--- /dev/null
+++ b/pkg/kn/commands/trigger/delete_test.go
@@ -0,0 +1,53 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package trigger
+
+import (
+	"errors"
+	"fmt"
+	"testing"
+
+	"gotest.tools/assert"
+	eventing_client "knative.dev/client/pkg/eventing/v1alpha1"
+	"knative.dev/client/pkg/util"
+)
+
+func TestTriggerDelete(t *testing.T) {
+	triggerName := "trigger-12345"
+
+	eventingClient := eventing_client.NewMockKnEventingClient(t)
+	eventingRecorder := eventingClient.Recorder()
+	eventingRecorder.DeleteTrigger(triggerName, nil)
+
+	out, err := executeTriggerCommand(eventingClient, nil, "delete", triggerName)
+	assert.NilError(t, err)
+	util.ContainsAll(out, "deleted", "testns", triggerName)
+
+	eventingRecorder.Validate()
+}
+
+func TestTriggerDeleteWithError(t *testing.T) {
+	triggerName := "trigger-12345"
+
+	eventingClient := eventing_client.NewMockKnEventingClient(t)
+	eventingRecorder := eventingClient.Recorder()
+	eventingRecorder.DeleteTrigger(triggerName, errors.New(fmt.Sprintf("trigger %s not found", triggerName)))
+
+	out, err := executeTriggerCommand(eventingClient, nil, "delete", triggerName)
+	assert.ErrorContains(t, err, triggerName)
+	util.ContainsAll(out, "trigger", triggerName, "not found")
+
+	eventingRecorder.Validate()
+}
diff --git a/pkg/kn/commands/trigger/describe_test.go b/pkg/kn/commands/trigger/describe_test.go
new file mode 100644
index 00000000..cab7813b
--- /dev/null
+++ b/pkg/kn/commands/trigger/describe_test.go
@@ -0,0 +1,89 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package trigger
+
+import (
+	"errors"
+	"testing"
+
+	"gotest.tools/assert"
+	"gotest.tools/assert/cmp"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	client_v1alpha1 "knative.dev/client/pkg/eventing/v1alpha1"
+	"knative.dev/client/pkg/util"
+	v1alpha1 "knative.dev/eventing/pkg/apis/eventing/v1alpha1"
+	duckv1 "knative.dev/pkg/apis/duck/v1"
+)
+
+func TestSimpleDescribe(t *testing.T) {
+	client := client_v1alpha1.NewMockKnEventingClient(t, "mynamespace")
+
+	recorder := client.Recorder()
+	recorder.GetTrigger("testtrigger", getTrigger(), nil)
+
+	out, err := executeTriggerCommand(client, nil, "describe", "testtrigger")
+	assert.NilError(t, err)
+
+	assert.Assert(t, cmp.Regexp("Name:\\s+testtrigger", out))
+	assert.Assert(t, cmp.Regexp("Namespace:\\s+default", out))
+
+	assert.Assert(t, util.ContainsAll(out, "Broker:", "mybroker"))
+	assert.Assert(t, util.ContainsAll(out, "Filter:", "type", "foo.type.knative", "source", "src.eventing.knative"))
+	assert.Assert(t, util.ContainsAll(out, "Sink:", "Service", "myservicenamespace", "mysvc"))
+
+	// Validate that all recorded API methods have been called
+	recorder.Validate()
+}
+
+func TestDescribeError(t *testing.T) {
+	client := client_v1alpha1.NewMockKnEventingClient(t, "mynamespace")
+
+	recorder := client.Recorder()
+	recorder.GetTrigger("testtrigger", nil, errors.New("triggers.eventing.knative.dev 'testtrigger' not found"))
+
+	_, err := executeTriggerCommand(client, nil, "describe", "testtrigger")
+	assert.ErrorContains(t, err, "testtrigger", "not found")
+
+	recorder.Validate()
+}
+
+func getTrigger() *v1alpha1.Trigger {
+	return &v1alpha1.Trigger{
+		TypeMeta: v1.TypeMeta{},
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      "testtrigger",
+			Namespace: "default",
+		},
+		Spec: v1alpha1.TriggerSpec{
+			Broker: "mybroker",
+			Filter: &v1alpha1.TriggerFilter{
+				Attributes: &v1alpha1.TriggerFilterAttributes{
+					"type":   "foo.type.knative",
+					"source": "src.eventing.knative",
+				},
+			},
+			Subscriber: &duckv1.Destination{
+				Ref: &corev1.ObjectReference{
+					Kind:      "Service",
+					Namespace: "myservicenamespace",
+					Name:      "mysvc",
+				},
+			},
+		},
+		Status: v1alpha1.TriggerStatus{},
+	}
+}
diff --git a/pkg/kn/commands/trigger/flag_test.go b/pkg/kn/commands/trigger/flag_test.go
new file mode 100644
index 00000000..e82ff6fe
--- /dev/null
+++ b/pkg/kn/commands/trigger/flag_test.go
@@ -0,0 +1,35 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package trigger
+
+import (
+	"testing"
+
+	"gotest.tools/assert"
+)
+
+func TestGetFilter(t *testing.T) {
+	t.Run("get multiple filters", func(t *testing.T) {
+		createFlag := TriggerUpdateFlags{
+			Filters: filterArray{"type=abc.edf.ghi", "attr=value"},
+		}
+		created := createFlag.GetFilters()
+		wanted := map[string]string{
+			"type": "abc.edf.ghi",
+			"attr": "value",
+		}
+		assert.DeepEqual(t, wanted, created)
+	})
+}
diff --git a/pkg/kn/commands/trigger/trigger_test.go b/pkg/kn/commands/trigger/trigger_test.go
new file mode 100644
index 00000000..6640ca0a
--- /dev/null
+++ b/pkg/kn/commands/trigger/trigger_test.go
@@ -0,0 +1,72 @@
+// Copyright © 2019 The Knative Authors
+//
+// 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.
+
+package trigger
+
+import (
+	"bytes"
+
+	"k8s.io/client-go/tools/clientcmd"
+
+	eventc_v1alpha1 "knative.dev/client/pkg/eventing/v1alpha1"
+	"knative.dev/client/pkg/kn/commands"
+	serving_client_v1alpha1 "knative.dev/client/pkg/serving/v1alpha1"
+)
+
+// Helper methods
+var blankConfig clientcmd.ClientConfig
+
+func init() {
+	var err error
+	blankConfig, err = clientcmd.NewClientConfigFromBytes([]byte(`kind: Config
+version: v1
+users:
+- name: u
+clusters:
+- name: c
+  cluster:
+    server: example.com
+contexts:
+- name: x
+  context:
+    user: u
+    cluster: c
+current-context: x
+`))
+	if err != nil {
+		panic(err)
+	}
+}
+
+func executeTriggerCommand(triggerClient eventc_v1alpha1.KnEventingClient, servingClient serving_client_v1alpha1.KnServingClient, args ...string) (string, error) {
+	knParams := &commands.KnParams{}
+	knParams.ClientConfig = blankConfig
+
+	output := new(bytes.Buffer)
+	knParams.Output = output
+	knParams.NewServingClient = func(namespace string) (serving_client_v1alpha1.KnServingClient, error) {
+		return servingClient, nil
+	}
+	knParams.NewEventingClient = func(namespace string) (eventc_v1alpha1.KnEventingClient, error) {
+		return triggerClient, nil
+	}
+
+	cmd := NewTriggerCommand(knParams)
+	cmd.SetArgs(args)
+	cmd.SetOutput(output)
+
+	err := cmd.Execute()
+
+	return output.String(), err
+}
diff --git a/pkg/kn/commands/types_test.go b/pkg/kn/commands/types_test.go
index ca84cb05..64575499 100644
--- a/pkg/kn/commands/types_test.go
+++ b/pkg/kn/commands/types_test.go
@@ -187,7 +187,7 @@ func TestNewSourcesClient(t *testing.T) {
 		}
 
 		if sourcesClient != nil {
-			assert.Assert(t, sourcesClient.ApiServerSourcesClient().Namespace() == namespace)
+			assert.Assert(t, sourcesClient.APIServerSourcesClient().Namespace() == namespace)
 			assert.Assert(t, sourcesClient.CronJobSourcesClient().Namespace() == namespace)
 		}
 	}
diff --git a/test/e2e/source_apiserver_test.go b/test/e2e/source_apiserver_test.go
index 7666777d..3cd8e9a5 100644
--- a/test/e2e/source_apiserver_test.go
+++ b/test/e2e/source_apiserver_test.go
@@ -31,41 +31,52 @@ func TestSourceApiServer(t *testing.T) {
 	test.Setup(t)
 	defer test.Teardown(t)
 
-	test.setupServiceAccountForApiserver(t, "mysa")
-	test.serviceCreate(t, "myservice")
+	test.setupServiceAccountForApiserver(t, "testsa")
+	test.serviceCreate(t, "testsvc0")
 
-	t.Run("create apiserver source with a sink to a service", func(t *testing.T) {
-		test.apiServerSourceCreate(t, "firstsrc", "Eventing:v1:true", "mysa", "svc:myservice")
-		test.apiServerSourceCreate(t, "secondsrc", "Eventing,Namespace", "mysa", "svc:myservice")
+	t.Run("create apiserver sources with a sink to a service", func(t *testing.T) {
+		test.apiServerSourceCreate(t, "testapisource0", "Event:v1:true", "testsa", "svc:testsvc0")
+		test.apiServerSourceCreate(t, "testapisource1", "Event", "testsa", "svc:testsvc0")
 	})
 
-	t.Run("create apiserver source and delete it", func(t *testing.T) {
-		test.apiServerSourceDelete(t, "firstsrc")
-		test.apiServerSourceDelete(t, "secondsrc")
+	t.Run("delete apiserver sources", func(t *testing.T) {
+		test.apiServerSourceDelete(t, "testapisource0")
+		test.apiServerSourceDelete(t, "testapisource1")
 	})
 
 	t.Run("create apiserver source with a missing sink service", func(t *testing.T) {
-		test.apiServerSourceCreateMissingSink(t, "wrongsrc", "Eventing:v1:true", "mysa", "svc:unknown")
+		test.apiServerSourceCreateMissingSink(t, "testapisource2", "Event:v1:true", "testsa", "svc:unknown")
+	})
+
+	t.Run("update apiserver source sink service", func(t *testing.T) {
+		test.apiServerSourceCreate(t, "testapisource3", "Event:1:true", "testsa", "svc:testsvc0")
+		test.serviceCreate(t, "testsvc1")
+		test.apiServerSourceUpdateSink(t, "testapisource3", "svc:testsvc1")
+		jpSinkRefNameInSpec := "jsonpath={.spec.sink.ref.name}"
+		out, err := test.getResourceFieldsWithJSONPath(t, "apiserversource", "testapisource3", jpSinkRefNameInSpec)
+		assert.NilError(t, err)
+		assert.Equal(t, out, "testsvc1")
+		// TODO(navidshaikh): Verify the source's status with synchronous create/update
 	})
 }
 
-func (test *e2eTest) apiServerSourceCreate(t *testing.T, srcName string, resources string, sa string, sink string) {
-	out, err := test.kn.RunWithOpts([]string{"source", "apiserver", "create", srcName,
+func (test *e2eTest) apiServerSourceCreate(t *testing.T, sourceName string, resources string, sa string, sink string) {
+	out, err := test.kn.RunWithOpts([]string{"source", "apiserver", "create", sourceName,
 		"--resource", resources, "--service-account", sa, "--sink", sink}, runOpts{NoNamespace: false})
 	assert.NilError(t, err)
-	assert.Check(t, util.ContainsAllIgnoreCase(out, "ApiServerSource", srcName, "created", "namespace", test.kn.namespace))
+	assert.Check(t, util.ContainsAllIgnoreCase(out, "apiserver", "source", sourceName, "created", "namespace", test.kn.namespace))
 }
 
-func (test *e2eTest) apiServerSourceCreateMissingSink(t *testing.T, srcName string, resources string, sa string, sink string) {
-	_, err := test.kn.RunWithOpts([]string{"source", "apiserver", "create", srcName,
+func (test *e2eTest) apiServerSourceCreateMissingSink(t *testing.T, sourceName string, resources string, sa string, sink string) {
+	_, err := test.kn.RunWithOpts([]string{"source", "apiserver", "create", sourceName,
 		"--resource", resources, "--service-account", sa, "--sink", sink}, runOpts{NoNamespace: false, AllowError: true})
 	assert.ErrorContains(t, err, "services.serving.knative.dev", "not found")
 }
 
-func (test *e2eTest) apiServerSourceDelete(t *testing.T, srcName string) {
-	out, err := test.kn.RunWithOpts([]string{"source", "apiserver", "delete", srcName}, runOpts{NoNamespace: false})
+func (test *e2eTest) apiServerSourceDelete(t *testing.T, sourceName string) {
+	out, err := test.kn.RunWithOpts([]string{"source", "apiserver", "delete", sourceName}, runOpts{NoNamespace: false})
 	assert.NilError(t, err)
-	assert.Check(t, util.ContainsAllIgnoreCase(out, "ApiServerSource", srcName, "deleted", "namespace", test.kn.namespace))
+	assert.Check(t, util.ContainsAllIgnoreCase(out, "apiserver", "source", sourceName, "deleted", "namespace", test.kn.namespace))
 }
 
 func (test *e2eTest) setupServiceAccountForApiserver(t *testing.T, name string) {
@@ -84,3 +95,19 @@ func (test *e2eTest) setupServiceAccountForApiserver(t *testing.T, name string)
 		t.Fatalf(fmt.Sprintf("Error executing 'kubectl clusterrolebinding testsa-binding'. Error: %s", err.Error()))
 	}
 }
+
+func (test *e2eTest) apiServerSourceUpdateSink(t *testing.T, sourceName string, sink string) {
+	out, err := test.kn.RunWithOpts([]string{"source", "apiserver", "update", sourceName, "--sink", sink}, runOpts{})
+	assert.NilError(t, err)
+	assert.Check(t, util.ContainsAll(out, sourceName, "updated", "namespace", test.kn.namespace))
+}
+
+func (test *e2eTest) getResourceFieldsWithJSONPath(t *testing.T, resource, name, jsonpath string) (string, error) {
+	kubectl := kubectl{t, Logger{}}
+	out, err := kubectl.RunWithOpts([]string{"get", resource, name, "-o", jsonpath, "-n", test.kn.namespace}, runOpts{})
+	if err != nil {
+		return "", err
+	}
+
+	return out, nil
+}