Repository: apache/camel-k
Pull request #5038 (2024-01-08 16:48:39)

chore(deps): bump github.com/cloudflare/circl from 1.3.3 to 1.3.7
Bumps [github.com/cloudflare/circl](https://github.com/cloudflare/circl) from 1.3.3 to 1.3.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/cloudflare/circl/releases">github.com/cloudflare/circl's releases</a>.</em></p>
<blockquote>
<h2>CIRCL v1.3.7</h2>
<h3>What's Changed</h3>
<ul>
<li>build(deps): bump golang.org/x/crypto from 0.3.1-0.20221117191849-2c476679df9a to 0.17.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/467">cloudflare/circl#467</a></li>
<li>kyber: remove division by q in ciphertext compression by <a href="https://github.com/bwesterb"><code>@​bwesterb</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/468">cloudflare/circl#468</a></li>
<li>Releasing CIRCL v1.3.7 by <a href="https://github.com/armfazh"><code>@​armfazh</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/469">cloudflare/circl#469</a></li>
</ul>
<h3>New Contributors</h3>
<ul>
<li><a href="https://github.com/dependabot"><code>@​dependabot</code></a> made their first contribution in <a href="https://redirect.github.com/cloudflare/circl/pull/467">cloudflare/circl#467</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/cloudflare/circl/compare/v1.3.6...v1.3.7">https://github.com/cloudflare/circl/compare/v1.3.6...v1.3.7</a></p>
<h2>CIRCL v1.3.6</h2>
<h3>What's Changed</h3>
<ul>
<li>internal: add TurboShake{128,256} by <a href="https://github.com/bwesterb"><code>@​bwesterb</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/430">cloudflare/circl#430</a></li>
<li>Kangaroo12 draft -10 by <a href="https://github.com/bwesterb"><code>@​bwesterb</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/431">cloudflare/circl#431</a></li>
<li>Add K12 as XOF by <a href="https://github.com/bwesterb"><code>@​bwesterb</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/437">cloudflare/circl#437</a></li>
<li>xof/k12: Fix a typo in the package documentation by <a href="https://github.com/cjpatton"><code>@​cjpatton</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/438">cloudflare/circl#438</a></li>
<li>Set CIRCL version for generated assembler code. by <a href="https://github.com/armfazh"><code>@​armfazh</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/440">cloudflare/circl#440</a></li>
<li>Add tkn20 benchmarks by <a href="https://github.com/tanyav2"><code>@​tanyav2</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/442">cloudflare/circl#442</a></li>
<li>Add partially blind RSA implementation by <a href="https://github.com/chris-wood"><code>@​chris-wood</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/445">cloudflare/circl#445</a></li>
<li>Update doc.go by <a href="https://github.com/nadimkobeissi"><code>@​nadimkobeissi</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/447">cloudflare/circl#447</a></li>
<li>tss/rsa: key generation for threshold RSA (safe primes) by <a href="https://github.com/armfazh"><code>@​armfazh</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/450">cloudflare/circl#450</a></li>
<li>Bumping Go version for CI jobs. by <a href="https://github.com/armfazh"><code>@​armfazh</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/457">cloudflare/circl#457</a></li>
<li>Spelling by <a href="https://github.com/jsoref"><code>@​jsoref</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/456">cloudflare/circl#456</a></li>
<li>blindrsa: updating blindrsa to be compliant with RFC9474 by <a href="https://github.com/armfazh"><code>@​armfazh</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/464">cloudflare/circl#464</a></li>
<li>Releasing CIRCL v1.3.6 by <a href="https://github.com/armfazh"><code>@​armfazh</code></a> in <a href="https://redirect.github.com/cloudflare/circl/pull/465">cloudflare/circl#465</a></li>
</ul>
<h3>New Contributors</h3>
<ul>
<li><a href="https://github.com/nadimkobeissi"><code>@​nadimkobeissi</code></a> made their first contribution in <a href="https://redirect.github.com/cloudflare/circl/pull/447">cloudflare/circl#447</a></li>
<li><a href="https://github.com/jsoref"><code>@​jsoref</code></a> made their first contribution in <a href="https://redirect.github.com/cloudflare/circl/pull/456">cloudflare/circl#456</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/cloudflare/circl/compare/v1.3.3...v1.3.6">https://github.com/cloudflare/circl/compare/v1.3.3...v1.3.6</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/cloudflare/circl/commit/c48866b3068dfa83721c021dec03c777ba91abab"><code>c48866b</code></a> Releasing CIRCL v1.3.7</li>
<li><a href="https://github.com/cloudflare/circl/commit/75ef91e8a2f438e6ce2b6e620d236add8be1887d"><code>75ef91e</code></a> kyber: remove division by q in ciphertext compression</li>
<li><a href="https://github.com/cloudflare/circl/commit/899732a43256a5d6fb779917f597b32939ca4ba4"><code>899732a</code></a> build(deps): bump golang.org/x/crypto</li>
<li><a href="https://github.com/cloudflare/circl/commit/99f0f715ca5fbec868f5a0db1df2be6dcd28dbaa"><code>99f0f71</code></a> Releasing CIRCL v1.3.6</li>
<li><a href="https://github.com/cloudflare/circl/commit/e728d0d84e7e7cd9027050a62aa14adb8dec147c"><code>e728d0d</code></a> Apply thibmeu code review suggestions</li>
<li><a href="https://github.com/cloudflare/circl/commit/ceb2d90c4922ec2e26be09a20f217ee57c8ba1c4"><code>ceb2d90</code></a> Updating blindrsa to be compliant with RFC9474.</li>
<li><a href="https://github.com/cloudflare/circl/commit/44133f703215856ee0b8f243778f24b001ff6c95"><code>44133f7</code></a> spelling: tripped</li>
<li><a href="https://github.com/cloudflare/circl/commit/c2076d67b2c717b1b1c6f3aa3b324bf93079b6fb"><code>c2076d6</code></a> spelling: transposes</li>
<li><a href="https://github.com/cloudflare/circl/commit/dad216659ee1c9969957557a713537ceb589fce5"><code>dad2166</code></a> spelling: title</li>
<li><a href="https://github.com/cloudflare/circl/commit/171c41832e7ec817b9b2873732db6da46bdb1139"><code>171c418</code></a> spelling: threshold</li>
<li>Additional commits viewable in <a href="https://github.com/cloudflare/circl/compare/v1.3.3...v1.3.7">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/cloudflare/circl&package-manager=go_modules&previous-version=1.3.3&new-version=1.3.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/apache/camel-k/network/alerts).

</details>


Patch:
diff --git a/.github/actions/kamel-prepare-env/action.yml b/.github/actions/kamel-prepare-env/action.yml
index 0ebb9a1d1..c5456eee1 100644
--- a/.github/actions/kamel-prepare-env/action.yml
+++ b/.github/actions/kamel-prepare-env/action.yml
@@ -40,7 +40,6 @@ runs:
       shell: bash
       if: ${{ env.KAMEL_PREPARE_ENV != 'true' }}
       run: |
-        ls -lart
         echo "Initial status:"
         df -h
 
diff --git a/.github/actions/release-nightly/action.yml b/.github/actions/release-nightly/action.yml
index ca9748fbf..c549b1df3 100644
--- a/.github/actions/release-nightly/action.yml
+++ b/.github/actions/release-nightly/action.yml
@@ -136,9 +136,9 @@ runs:
       working-directory: java/crds
       shell: bash
       run: |
-        mvn clean deploy --settings ../.github/asf-deploy-settings.xml -q
+        mvn clean deploy --settings ../../.github/asf-deploy-settings.xml -q
     - name: Deploy Camel-K-maven-logging to ASF Snapshots Repository
       working-directory: java/maven-logging
       shell: bash
       run: |
-        mvn clean deploy --settings ../.github/asf-deploy-settings.xml -q
\ No newline at end of file
+        mvn clean deploy --settings ../../.github/asf-deploy-settings.xml -q
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 205a47697..408d32020 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,16 +6,25 @@
 
 **Closed issues:**
 
-- Nightly release soft failure [\#5023](https://github.com/apache/camel-k/issues/5023)
+- Brew Kamel procedure is failing [\#5030](https://github.com/apache/camel-k/issues/5030)
 - Integrations fail with Jib publish strategy [\#5007](https://github.com/apache/camel-k/issues/5007)
+- Release 2.2.0 [\#4991](https://github.com/apache/camel-k/issues/4991)
 - Multi arch operator default to AMD64 based image [\#4988](https://github.com/apache/camel-k/issues/4988)
+- Improve pipe status when the pod is full of exceptions [\#4977](https://github.com/apache/camel-k/issues/4977)
+- Knative installation check is wrong  [\#4962](https://github.com/apache/camel-k/issues/4962)
 - Wildcards in Routes Sources [\#4941](https://github.com/apache/camel-k/issues/4941)
 
 **Merged pull requests:**
 
+- fix\(docs\): remove languages [\#5035](https://github.com/apache/camel-k/pull/5035) ([squakez](https://github.com/squakez))
+- Update installation.adoc to fix grammatical error \(to -\> the\) [\#5034](https://github.com/apache/camel-k/pull/5034) ([stefkiourk](https://github.com/stefkiourk))
+- chore\(ci\): remove coverage check [\#5031](https://github.com/apache/camel-k/pull/5031) ([squakez](https://github.com/squakez))
+- chore\(ci\): helm 2.2.0 [\#5029](https://github.com/apache/camel-k/pull/5029) ([squakez](https://github.com/squakez))
+- fix\(knative\): func to check when either serving or eventing are insta… [\#5026](https://github.com/apache/camel-k/pull/5026) ([squakez](https://github.com/squakez))
 - fix\(ci\): publish java modules to snapshots repo [\#5025](https://github.com/apache/camel-k/pull/5025) ([squakez](https://github.com/squakez))
 - chore\(deps\): bump golang.org/x/term from 0.15.0 to 0.16.0 [\#5022](https://github.com/apache/camel-k/pull/5022) ([dependabot[bot]](https://github.com/apps/dependabot))
 - chore\(deps\): bump golang.org/x/sync from 0.5.0 to 0.6.0 [\#5021](https://github.com/apache/camel-k/pull/5021) ([dependabot[bot]](https://github.com/apps/dependabot))
+- fix\(ctrl\): monitor Pod ready condition [\#5020](https://github.com/apache/camel-k/pull/5020) ([squakez](https://github.com/squakez))
 - fix\(ci\): golang caching is already part of go actions [\#5018](https://github.com/apache/camel-k/pull/5018) ([squakez](https://github.com/squakez))
 - fix\(\#5007\): Jib publish strategy registry secret [\#5016](https://github.com/apache/camel-k/pull/5016) ([gansheer](https://github.com/gansheer))
 - feat: add support for glob pattern in run sources  [\#5015](https://github.com/apache/camel-k/pull/5015) ([rinaldodev](https://github.com/rinaldodev))
diff --git a/README.adoc b/README.adoc
index 00b2ab183..484f3b514 100644
--- a/README.adoc
+++ b/README.adoc
@@ -11,7 +11,7 @@ image:https://github.com/apache/camel-k/workflows/kubernetes/badge.svg["Kubernet
 image:https://github.com/apache/camel-k/workflows/knative/badge.svg["Knative", link="https://github.com/apache/camel-k/actions/workflows/knative.yml"]
 image:https://github.com/apache/camel-k/actions/workflows/nightly-release.yml/badge.svg["Nightly releases", link="https://github.com/apache/camel-k/actions/workflows/nightly-release.yml"]
 image:https://github.com/apache/camel-k/actions/workflows/nightly-native-test.yml/badge.svg["Quarkus native", link="https://github.com/apache/camel-k/actions/workflows/nightly-native-test.yml"]
-image:https://img.shields.io/badge/Coverage-33.7%25-yellow.svg["Go coverage", link="https://github.com/apache/camel-k/actions/workflows/nightly-coverage.yml"]
+image:https://img.shields.io/badge/Coverage-33.8%25-yellow.svg["Go coverage", link="https://github.com/apache/camel-k/actions/workflows/nightly-coverage.yml"]
 image:https://img.shields.io/badge/zulip-join_chat-brightgreen.svg["Chat on Zulip", link="https://camel.zulipchat.com"]
 
 Apache Camel K is a lightweight integration framework built from **Apache Camel** that runs natively on Kubernetes and is specifically designed for serverless and microservice architectures. Users of `Camel K` can instantly run integration code written in Camel DSL on their preferred **Cloud** provider.
diff --git a/camel-k-sbom/camel-k-sbom.json b/camel-k-sbom/camel-k-sbom.json
index 3aaecdd02..12c17730b 100644
--- a/camel-k-sbom/camel-k-sbom.json
+++ b/camel-k-sbom/camel-k-sbom.json
@@ -2,10 +2,10 @@
   "$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
   "bomFormat": "CycloneDX",
   "specVersion": "1.4",
-  "serialNumber": "urn:uuid:9da2ebc9-17e7-437a-abd0-dadc515ff969",
+  "serialNumber": "urn:uuid:be6fb9f6-64cb-40b0-a6bf-0f051f8e6433",
   "version": 1,
   "metadata": {
-    "timestamp": "2024-01-07T23:46:25Z",
+    "timestamp": "2024-01-08T23:43:18Z",
     "tools": [
       {
         "vendor": "CycloneDX",
@@ -46,11 +46,11 @@
       }
     ],
     "component": {
-      "bom-ref": "pkg:golang/github.com/apache/camel-k/v2@v0.0.0-20240106234535-618c011740a1?type=module",
+      "bom-ref": "pkg:golang/github.com/apache/camel-k/v2@v0.0.0-20240108234257-bf57ca8e1cce?type=module",
       "type": "application",
       "name": "github.com/apache/camel-k/v2",
-      "version": "v0.0.0-20240106234535-618c011740a1",
-      "purl": "pkg:golang/github.com/apache/camel-k/v2@v0.0.0-20240106234535-618c011740a1?type=module\u0026goos=linux\u0026goarch=amd64",
+      "version": "v0.0.0-20240108234257-bf57ca8e1cce",
+      "purl": "pkg:golang/github.com/apache/camel-k/v2@v0.0.0-20240108234257-bf57ca8e1cce?type=module\u0026goos=linux\u0026goarch=amd64",
       "externalReferences": [
         {
           "url": "https://github.com/apache/camel-k",
@@ -3830,7 +3830,7 @@
   ],
   "dependencies": [
     {
-      "ref": "pkg:golang/github.com/apache/camel-k/v2@v0.0.0-20240106234535-618c011740a1?type=module",
+      "ref": "pkg:golang/github.com/apache/camel-k/v2@v0.0.0-20240108234257-bf57ca8e1cce?type=module",
       "dependsOn": [
         "pkg:golang/github.com/Masterminds/semver@v1.5.0?type=module",
         "pkg:golang/github.com/container-tools/spectrum@v0.6.42?type=module",
diff --git a/config/manager/operator-deployment.yaml b/config/manager/operator-deployment.yaml
index ae47c6e29..f44e150d5 100644
--- a/config/manager/operator-deployment.yaml
+++ b/config/manager/operator-deployment.yaml
@@ -72,6 +72,9 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.namespace
+            # Change to true to be able to create synthetic Integrations
+            - name: CAMEL_K_SYNTHETIC_INTEGRATIONS
+              value: "false"
           livenessProbe:
             httpGet:
               path: /healthz
diff --git a/config/rbac/namespaced/operator-role.yaml b/config/rbac/namespaced/operator-role.yaml
index 4ddc2d4c1..0f364463e 100644
--- a/config/rbac/namespaced/operator-role.yaml
+++ b/config/rbac/namespaced/operator-role.yaml
@@ -45,6 +45,7 @@ rules:
   - camel.apache.org
   resources:
   - builds
+  - integrations
   verbs:
   - delete
 - apiGroups:
diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc
index 017b36dfc..20fb04f30 100644
--- a/docs/modules/ROOT/nav.adoc
+++ b/docs/modules/ROOT/nav.adoc
@@ -20,8 +20,9 @@
 ** xref:running/dev-mode.adoc[Developer mode]
 ** xref:running/dry-run.adoc[Dry run]
 ** xref:running/runtime-version.adoc[Camel version]
-** xref:running/camel-runtimes.adoc[Camel runtimes]
 ** xref:running/quarkus-native.adoc[Quarkus Native]
+** xref:running/camel-runtimes.adoc[Camel runtimes]
+** xref:running/import.adoc[Import existing Camel apps]
 ** xref:running/run-from-github.adoc[Run from GitHub]
 ** xref:running/promoting.adoc[Promote an Integration]
 ** xref:running/knative-sink.adoc[Knative Sinks]
diff --git a/docs/modules/ROOT/pages/running/import.adoc b/docs/modules/ROOT/pages/running/import.adoc
new file mode 100644
index 000000000..9fa8099b8
--- /dev/null
+++ b/docs/modules/ROOT/pages/running/import.adoc
@@ -0,0 +1,44 @@
+= Importing existing Camel applications
+
+You may have already a Camel application running on your cluster. You may have created it via a manual deployment, a CICD or any other deployment mechanism you have in place. Since the Camel K operator is meant to operate any Camel application out there, then, you will be able to import it and monitor in a similar fashion of any other Camel K **managed Integration**.
+
+This feature is disabled by default. In order to enable it, you need to run the operator deployment with an environment variable, `CAMEL_K_SYNTHETIC_INTEGRATIONS`, set to `true`.
+
+NOTE: you will be only able to monitor the synthetic Integrations. Camel K won't be able to alter the lifecycle of non managed Integrations (ie, rebuild the original application).
+
+It's important to notice that the operator won't be altering any field of the original application in order to avoid breaking any deployment procedure which is already in place. As it cannot make any assumption on the way the application is built and deployed, it will only be able to **watch** for any changes happening around it.
+
+[[deploy-and-monitor]]
+== Deploy externally, monitor via Camel K Operator
+
+An imported Integration is known as **synthetic Integration**. You can import any Camel application deployed as a **Deployment**, **CronJob** or **Knative Service**. We control this behavior via a label (`camel.apache.org/integration`) that the user need to apply on the Camel application (either manually or introducing in the deployment process, ie, via CICD).
+
+NOTE: the example here will work in a similar way using CronJob and Knative Service.
+
+As an example, we show how to import a Camel application which was deployed with the Deployment kind. Let's assume it is called `my-deploy`.
+```
+$ kubectl label deploy my-camel-sb-svc camel.apache.org/integration=my-it
+```
+The operator immediately creates a synthetic Integration:
+```
+$ kubectl get it
+NAMESPACE                                   NAME    PHASE   RUNTIME PROVIDER   RUNTIME VERSION   KIT   REPLICAS
+test-79c385c3-d58e-4c28-826d-b14b6245f908   my-it   Running
+```
+You can see it will be in `Running` status phase. However, checking the conditions you will be able to see that the Integration is not yet able to be fully monitored. This is expected because the way Camel K operator monitor Pods. It requires that the same label applied to the Deployment is inherited by the generated Pods. For this reason, beside labelling the Deployment, we need to add a label in the Deployment template.
+```
+$ kubectl patch deployment my-camel-sb-svc --patch '{"spec": {"template": {"metadata": {"labels": {"camel.apache.org/integration": "my-it"}}}}}'
+```
+Also this operation can be performed manually or automated in the deployment procedure. We can see now that the operator will be able to monitor accordingly the status of the Pods:
+```
+$ kubectl get it
+NAMESPACE                                   NAME    PHASE   RUNTIME PROVIDER   RUNTIME VERSION   KIT   REPLICAS
+test-79c385c3-d58e-4c28-826d-b14b6245f908   my-it   Running                                                          1
+```
+From now on, you will be able to monitor the status of the synthetic Integration in a similar fashion of what you do with managed Integrations. If, for example, your Deployment will scale up or down, then, you will see this information reflecting accordingly:
+```
+$ kubectl scale deployment my-camel-sb-svc --replicas 2
+$ kubectl get it
+NAMESPACE                                   NAME    PHASE   RUNTIME PROVIDER   RUNTIME VERSION   KIT   REPLICAS
+test-79c385c3-d58e-4c28-826d-b14b6245f908   my-it   Running                                                          2
+```
diff --git a/go.mod b/go.mod
index 2bdc63fc8..e17b596ff 100644
--- a/go.mod
+++ b/go.mod
@@ -37,7 +37,7 @@ require (
 	go.uber.org/automaxprocs v1.5.3
 	go.uber.org/multierr v1.11.0
 	go.uber.org/zap v1.26.0
-	golang.org/x/oauth2 v0.15.0
+	golang.org/x/oauth2 v0.16.0
 	golang.org/x/sync v0.6.0
 	golang.org/x/term v0.16.0
 	golang.org/x/text v0.14.0
@@ -71,7 +71,7 @@ require (
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/cloudevents/sdk-go/sql/v2 v2.13.0 // indirect
 	github.com/cloudevents/sdk-go/v2 v2.13.0 // indirect
-	github.com/cloudflare/circl v1.3.3 // indirect
+	github.com/cloudflare/circl v1.3.7 // indirect
 	github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect
 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 	github.com/docker/cli v24.0.7+incompatible // indirect
@@ -128,10 +128,10 @@ require (
 	github.com/subosito/gotenv v1.6.0 // indirect
 	github.com/vbatts/tar-split v0.11.3 // indirect
 	go.opencensus.io v0.24.0 // indirect
-	golang.org/x/crypto v0.17.0 // indirect
+	golang.org/x/crypto v0.18.0 // indirect
 	golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
 	golang.org/x/mod v0.13.0 // indirect
-	golang.org/x/net v0.19.0 // indirect
+	golang.org/x/net v0.20.0 // indirect
 	golang.org/x/sys v0.16.0 // indirect
 	golang.org/x/tools v0.14.0 // indirect
 	gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
diff --git a/go.sum b/go.sum
index 59fa1a93e..1a74a5e01 100644
--- a/go.sum
+++ b/go.sum
@@ -81,8 +81,8 @@ github.com/cloudevents/sdk-go/sql/v2 v2.13.0/go.mod h1:XZRQBCgRreddIpQrdjBJQUrRg
 github.com/cloudevents/sdk-go/v2 v2.13.0 h1:2zxDS8RyY1/wVPULGGbdgniGXSzLaRJVl136fLXGsYw=
 github.com/cloudevents/sdk-go/v2 v2.13.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To=
 github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I=
-github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs=
-github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
+github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
+github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
@@ -480,8 +480,8 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
+golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -556,8 +556,8 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx
 golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
-golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
+golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
+golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -565,8 +565,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr
 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ=
-golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM=
+golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ=
+golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
diff --git a/helm/camel-k/templates/operator-role.yaml b/helm/camel-k/templates/operator-role.yaml
index b8e709b80..40ef9742a 100644
--- a/helm/camel-k/templates/operator-role.yaml
+++ b/helm/camel-k/templates/operator-role.yaml
@@ -54,6 +54,7 @@ rules:
   - camel.apache.org
   resources:
   - builds
+  - integrations
   verbs:
   - delete
 - apiGroups:
diff --git a/pkg/apis/camel/v1/integration_types.go b/pkg/apis/camel/v1/integration_types.go
index 78dd40a8c..9f293f6a6 100644
--- a/pkg/apis/camel/v1/integration_types.go
+++ b/pkg/apis/camel/v1/integration_types.go
@@ -156,6 +156,8 @@ const (
 	// IntegrationPhaseError --.
 	IntegrationPhaseError IntegrationPhase = "Error"
 
+	// IntegrationConditionReady --.
+	IntegrationConditionReady IntegrationConditionType = "Ready"
 	// IntegrationConditionKitAvailable --.
 	IntegrationConditionKitAvailable IntegrationConditionType = "IntegrationKitAvailable"
 	// IntegrationConditionPlatformAvailable --.
@@ -178,10 +180,9 @@ const (
 	IntegrationConditionJolokiaAvailable IntegrationConditionType = "JolokiaAvailable"
 	// IntegrationConditionProbesAvailable --.
 	IntegrationConditionProbesAvailable IntegrationConditionType = "ProbesAvailable"
-	// IntegrationConditionReady --.
-	IntegrationConditionReady IntegrationConditionType = "Ready"
 	// IntegrationConditionTraitInfo --.
 	IntegrationConditionTraitInfo IntegrationConditionType = "TraitInfo"
+
 	// IntegrationConditionKitAvailableReason --.
 	IntegrationConditionKitAvailableReason string = "IntegrationKitAvailable"
 	// IntegrationConditionPlatformAvailableReason --.
@@ -220,7 +221,8 @@ const (
 	IntegrationConditionJolokiaAvailableReason string = "JolokiaAvailable"
 	// IntegrationConditionProbesAvailableReason --.
 	IntegrationConditionProbesAvailableReason string = "ProbesAvailable"
-
+	// IntegrationConditionMonitoringPodsAvailableReason used to specify that the Pods generated are available for monitoring.
+	IntegrationConditionMonitoringPodsAvailableReason string = "MonitoringPodsAvailable"
 	// IntegrationConditionKnativeServiceReadyReason --.
 	IntegrationConditionKnativeServiceReadyReason string = "KnativeServiceReady"
 	// IntegrationConditionDeploymentReadyReason --.
@@ -239,18 +241,18 @@ const (
 	IntegrationConditionRuntimeNotReadyReason string = "RuntimeNotReady"
 	// IntegrationConditionErrorReason --.
 	IntegrationConditionErrorReason string = "Error"
-
 	// IntegrationConditionInitializationFailedReason --.
 	IntegrationConditionInitializationFailedReason string = "InitializationFailed"
 	// IntegrationConditionUnsupportedLanguageReason --.
 	IntegrationConditionUnsupportedLanguageReason string = "UnsupportedLanguage"
-
 	// IntegrationConditionKameletsAvailable --.
 	IntegrationConditionKameletsAvailable IntegrationConditionType = "KameletsAvailable"
 	// IntegrationConditionKameletsAvailableReason --.
 	IntegrationConditionKameletsAvailableReason string = "KameletsAvailable"
 	// IntegrationConditionKameletsNotAvailableReason --.
 	IntegrationConditionKameletsNotAvailableReason string = "KameletsNotAvailable"
+	// IntegrationConditionImportingKindAvailableReason used (as false) if we're trying to import an unsupported kind.
+	IntegrationConditionImportingKindAvailableReason string = "ImportingKindAvailable"
 )
 
 // IntegrationCondition describes the state of a resource at a certain point.
diff --git a/pkg/apis/camel/v1/integration_types_support.go b/pkg/apis/camel/v1/integration_types_support.go
index ef24e207b..3342be76a 100644
--- a/pkg/apis/camel/v1/integration_types_support.go
+++ b/pkg/apis/camel/v1/integration_types_support.go
@@ -25,8 +25,18 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
+// IntegrationLabel is used to tag k8s object created by a given Integration.
 const IntegrationLabel = "camel.apache.org/integration"
 
+// IntegrationSyntheticLabel is used to tag k8s synthetic Integrations.
+const IntegrationSyntheticLabel = "camel.apache.org/is-synthetic"
+
+// IntegrationImportedKindLabel specifies from what kind of resource an Integration was imported.
+const IntegrationImportedKindLabel = "camel.apache.org/imported-from-kind"
+
+// IntegrationImportedNameLabel specifies from what resource an Integration was imported.
+const IntegrationImportedNameLabel = "camel.apache.org/imported-from-name"
+
 func NewIntegration(namespace string, name string) Integration {
 	return Integration{
 		TypeMeta: metav1.TypeMeta{
@@ -283,6 +293,11 @@ func (in *Integration) SetReadyConditionError(err string) {
 	in.SetReadyCondition(corev1.ConditionFalse, IntegrationConditionErrorReason, err)
 }
 
+// IsSynthetic returns true for synthetic Integrations (non managed, likely imported from external deployments).
+func (in *Integration) IsSynthetic() bool {
+	return in.Annotations[IntegrationSyntheticLabel] == "true"
+}
+
 // GetCondition returns the condition with the provided type.
 func (in *IntegrationStatus) GetCondition(condType IntegrationConditionType) *IntegrationCondition {
 	for i := range in.Conditions {
diff --git a/pkg/cmd/operator/operator.go b/pkg/cmd/operator/operator.go
index 04b5ea8b2..f4bf99b82 100644
--- a/pkg/cmd/operator/operator.go
+++ b/pkg/cmd/operator/operator.go
@@ -59,6 +59,7 @@ import (
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	"github.com/apache/camel-k/v2/pkg/client"
 	"github.com/apache/camel-k/v2/pkg/controller"
+	"github.com/apache/camel-k/v2/pkg/controller/synthetic"
 	"github.com/apache/camel-k/v2/pkg/event"
 	"github.com/apache/camel-k/v2/pkg/install"
 	"github.com/apache/camel-k/v2/pkg/platform"
@@ -231,6 +232,13 @@ func Run(healthPort, monitoringPort int32, leaderElection bool, leaderElectionID
 	install.OperatorStartupOptionalTools(installCtx, bootstrapClient, watchNamespace, operatorNamespace, log)
 	exitOnError(findOrCreateIntegrationPlatform(installCtx, bootstrapClient, operatorNamespace), "failed to create integration platform")
 
+	synthEnvVal, synth := os.LookupEnv("CAMEL_K_SYNTHETIC_INTEGRATIONS")
+	if synth && synthEnvVal == "true" {
+		log.Info("Starting the synthetic Integration manager")
+		exitOnError(synthetic.ManageSyntheticIntegrations(ctx, ctrlClient, mgr.GetCache()), "synthetic Integration manager error")
+	} else {
+		log.Info("Synthetic Integration manager not configured, skipping")
+	}
 	log.Info("Starting the manager")
 	exitOnError(mgr.Start(ctx), "manager exited non-zero")
 }
diff --git a/pkg/controller/integration/initialize.go b/pkg/controller/integration/initialize.go
index a08dd28c6..ad8891647 100644
--- a/pkg/controller/integration/initialize.go
+++ b/pkg/controller/integration/initialize.go
@@ -19,6 +19,7 @@ package integration
 
 import (
 	"context"
+	"fmt"
 
 	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
@@ -53,6 +54,10 @@ func (action *initializeAction) CanHandle(integration *v1.Integration) bool {
 func (action *initializeAction) Handle(ctx context.Context, integration *v1.Integration) (*v1.Integration, error) {
 	action.L.Info("Initializing Integration")
 
+	if integration.Annotations[v1.IntegrationImportedNameLabel] != "" {
+		return action.importFromExternalApp(integration)
+	}
+
 	if _, err := trait.Apply(ctx, action.client, integration, nil); err != nil {
 		integration.Status.Phase = v1.IntegrationPhaseError
 		integration.SetReadyCondition(corev1.ConditionFalse,
@@ -91,3 +96,85 @@ func (action *initializeAction) Handle(ctx context.Context, integration *v1.Inte
 
 	return integration, nil
 }
+
+func (action *initializeAction) importFromExternalApp(integration *v1.Integration) (*v1.Integration, error) {
+	readyMessage := fmt.Sprintf(
+		"imported from %s %s",
+		integration.Annotations[v1.IntegrationImportedNameLabel],
+		integration.Annotations[v1.IntegrationImportedKindLabel],
+	)
+	// We need to set the condition for which this Integration is imported (required later by monitoring)
+	integration.Status.SetConditions(
+		getCamelAppImportingCondition(
+			integration.Annotations[v1.IntegrationImportedKindLabel],
+			readyMessage,
+		)...,
+	)
+	// If it's ready, then we can safely assume the integration is running
+	if integration.IsConditionTrue(v1.IntegrationConditionReady) {
+		integration.Status.Phase = v1.IntegrationPhaseRunning
+	} else {
+		integration.Status.Phase = v1.IntegrationPhaseError
+	}
+
+	return integration, nil
+}
+
+func getCamelAppImportingCondition(kind, message string) []v1.IntegrationCondition {
+	switch kind {
+	case "Deployment":
+		return []v1.IntegrationCondition{
+			{
+				Type:    v1.IntegrationConditionDeploymentAvailable,
+				Status:  corev1.ConditionTrue,
+				Reason:  v1.IntegrationConditionDeploymentAvailableReason,
+				Message: message,
+			},
+			{
+				Type:    v1.IntegrationConditionReady,
+				Status:  corev1.ConditionTrue,
+				Reason:  v1.IntegrationConditionDeploymentReadyReason,
+				Message: message,
+			},
+		}
+	case "CronJob":
+		return []v1.IntegrationCondition{
+			{
+				Type:    v1.IntegrationConditionCronJobAvailable,
+				Status:  corev1.ConditionTrue,
+				Reason:  v1.IntegrationConditionCronJobCreatedReason,
+				Message: message,
+			},
+			{
+				Type:    v1.IntegrationConditionReady,
+				Status:  corev1.ConditionTrue,
+				Reason:  v1.IntegrationConditionDeploymentReadyReason,
+				Message: message,
+			},
+		}
+	case "KnativeService":
+		return []v1.IntegrationCondition{
+			{
+				Type:    v1.IntegrationConditionKnativeServiceAvailable,
+				Status:  corev1.ConditionTrue,
+				Reason:  v1.IntegrationConditionKnativeServiceAvailableReason,
+				Message: message,
+			},
+			{
+				Type:    v1.IntegrationConditionReady,
+				Status:  corev1.ConditionTrue,
+				Reason:  v1.IntegrationConditionKnativeServiceReadyReason,
+				Message: message,
+			},
+		}
+	default:
+		return []v1.IntegrationCondition{
+			{
+				Type:    v1.IntegrationConditionReady,
+				Status:  corev1.ConditionFalse,
+				Reason:  v1.IntegrationConditionImportingKindAvailableReason,
+				Message: fmt.Sprintf("Unsupported %s import kind", kind),
+			},
+		}
+	}
+}
diff --git a/pkg/controller/integration/integration_controller.go b/pkg/controller/integration/integration_controller.go
index a70a8713b..5129f6ade 100644
--- a/pkg/controller/integration/integration_controller.go
+++ b/pkg/controller/integration/integration_controller.go
@@ -32,7 +32,6 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/tools/record"
 	"k8s.io/utils/pointer"
-
 	"sigs.k8s.io/controller-runtime/pkg/builder"
 	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/event"
@@ -324,30 +323,47 @@ func add(ctx context.Context, mgr manager.Manager, c client.Client, r reconcile.
 					// Evaluates to false if the object has been confirmed deleted
 					return !e.DeleteStateUnknown
 				},
-			})).
-		// Watch for IntegrationKit phase transitioning to ready or error, and
-		// enqueue requests for any integration that matches the kit, in building
-		// or running phase.
-		Watches(&v1.IntegrationKit{},
-			handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, a ctrl.Object) []reconcile.Request {
-				kit, ok := a.(*v1.IntegrationKit)
-				if !ok {
-					log.Error(fmt.Errorf("type assertion failed: %v", a), "Failed to retrieve integration list")
-					return []reconcile.Request{}
-				}
+			}))
+	// Watch for all the resources
+	watchIntegrationResources(c, b)
+	// Watch for the CronJob conditionally
+	if ok, err := kubernetes.IsAPIResourceInstalled(c, batchv1.SchemeGroupVersion.String(), reflect.TypeOf(batchv1.CronJob{}).Name()); ok && err == nil {
+		watchCronJobResources(b)
+	}
+	// Watch for the Knative Services conditionally
+	if ok, err := kubernetes.IsAPIResourceInstalled(c, servingv1.SchemeGroupVersion.String(), reflect.TypeOf(servingv1.Service{}).Name()); err != nil {
+		return err
+	} else if ok {
+		if err = watchKnativeResources(ctx, c, b); err != nil {
+			return err
+		}
+	}
 
-				return integrationKitEnqueueRequestsFromMapFunc(ctx, c, kit)
-			})).
+	return b.Complete(r)
+}
+
+func watchIntegrationResources(c client.Client, b *builder.Builder) {
+	// Watch for IntegrationKit phase transitioning to ready or error, and
+	// enqueue requests for any integration that matches the kit, in building
+	// or running phase.
+	b.Watches(&v1.IntegrationKit{},
+		handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, a ctrl.Object) []reconcile.Request {
+			kit, ok := a.(*v1.IntegrationKit)
+			if !ok {
+				log.Error(fmt.Errorf("type assertion failed: %v", a), "Failed to retrieve IntegrationKit")
+				return []reconcile.Request{}
+			}
+			return integrationKitEnqueueRequestsFromMapFunc(ctx, c, kit)
+		})).
 		// Watch for IntegrationPlatform phase transitioning to ready and enqueue
 		// requests for any integrations that are in phase waiting for platform
 		Watches(&v1.IntegrationPlatform{},
 			handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, a ctrl.Object) []reconcile.Request {
 				p, ok := a.(*v1.IntegrationPlatform)
 				if !ok {
-					log.Error(fmt.Errorf("type assertion failed: %v", a), "Failed to list integrations")
+					log.Error(fmt.Errorf("type assertion failed: %v", a), "Failed to retrieve IntegrationPlatform")
 					return []reconcile.Request{}
 				}
-
 				return integrationPlatformEnqueueRequestsFromMapFunc(ctx, c, p)
 			})).
 		// Watch for Configmaps or Secret used in the Integrations for updates
@@ -355,30 +371,29 @@ func add(ctx context.Context, mgr manager.Manager, c client.Client, r reconcile.
 			handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, a ctrl.Object) []reconcile.Request {
 				cm, ok := a.(*corev1.ConfigMap)
 				if !ok {
-					log.Error(fmt.Errorf("type assertion failed: %v", a), "Failed to retrieve integration list")
+					log.Error(fmt.Errorf("type assertion failed: %v", a), "Failed to retrieve to retrieve Configmap")
 					return []reconcile.Request{}
 				}
-
 				return configmapEnqueueRequestsFromMapFunc(ctx, c, cm)
 			})).
 		Watches(&corev1.Secret{},
 			handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, a ctrl.Object) []reconcile.Request {
 				secret, ok := a.(*corev1.Secret)
 				if !ok {
-					log.Error(fmt.Errorf("type assertion failed: %v", a), "Failed to retrieve integration list")
+					log.Error(fmt.Errorf("type assertion failed: %v", a), "Failed to retrieve to retrieve Secret")
 					return []reconcile.Request{}
 				}
-
 				return secretEnqueueRequestsFromMapFunc(ctx, c, secret)
 			})).
-		// Watch for the owned Deployments
-		Owns(&appsv1.Deployment{}, builder.WithPredicates(StatusChangedPredicate{})).
-		// Watch for the Integration Pods
+		// Watch for the Integration Pods belonging to managed Integrations
 		Watches(&corev1.Pod{},
 			handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, a ctrl.Object) []reconcile.Request {
 				pod, ok := a.(*corev1.Pod)
 				if !ok {
-					log.Error(fmt.Errorf("type assertion failed: %v", a), "Failed to list integration pods")
+					log.Error(fmt.Errorf("type assertion failed: %v", a), "Failed to retrieve to retrieve Pod")
+					return []reconcile.Request{}
+				}
+				if pod.Labels[v1.IntegrationLabel] == "" {
 					return []reconcile.Request{}
 				}
 				return []reconcile.Request{
@@ -389,13 +404,17 @@ func add(ctx context.Context, mgr manager.Manager, c client.Client, r reconcile.
 						},
 					},
 				}
-			}))
+			})).
+		// Watch for the owned Deployments
+		Owns(&appsv1.Deployment{}, builder.WithPredicates(StatusChangedPredicate{}))
+}
 
-	if ok, err := kubernetes.IsAPIResourceInstalled(c, batchv1.SchemeGroupVersion.String(), reflect.TypeOf(batchv1.CronJob{}).Name()); ok && err == nil {
-		// Watch for the owned CronJobs
-		b.Owns(&batchv1.CronJob{}, builder.WithPredicates(StatusChangedPredicate{}))
-	}
+func watchCronJobResources(b *builder.Builder) {
+	// Watch for the owned CronJobs
+	b.Owns(&batchv1.CronJob{}, builder.WithPredicates(StatusChangedPredicate{}))
+}
 
+func watchKnativeResources(ctx context.Context, c client.Client, b *builder.Builder) error {
 	// Watch for the owned Knative Services conditionally
 	if ok, err := kubernetes.IsAPIResourceInstalled(c, servingv1.SchemeGroupVersion.String(), reflect.TypeOf(servingv1.Service{}).Name()); err != nil {
 		return err
@@ -410,15 +429,15 @@ func add(ctx context.Context, mgr manager.Manager, c client.Client, r reconcile.
 			b.Owns(&servingv1.Service{}, builder.WithPredicates(StatusChangedPredicate{}))
 		} else {
 			log.Info(` KnativeService resources installed in the cluster. However Camel K operator has not the required RBAC privileges. You can't use Knative features.
-			Make sure to apply the required RBAC privileges and restart the Camel K Operator Pod to be able to watch for Camel K managed Knative Services.`)
+				Make sure to apply the required RBAC privileges and restart the Camel K Operator Pod to be able to watch for Camel K managed Knative Services.`)
 		}
 	} else {
 		log.Info(`KnativeService resources are not installed in the cluster. You can't use Knative features. If you install Knative Serving resources after the
-		Camel K operator, make sure to apply the required RBAC privileges and restart the Camel K Operator Pod to be able to watch for
-		Camel K managed Knative Services.`)
+			Camel K operator, make sure to apply the required RBAC privileges and restart the Camel K Operator Pod to be able to watch for
+			Camel K managed Knative Services.`)
 	}
 
-	return b.Complete(r)
+	return nil
 }
 
 var _ reconcile.Reconciler = &reconcileIntegration{}
@@ -476,7 +495,12 @@ func (r *reconcileIntegration) Reconcile(ctx context.Context, request reconcile.
 		NewPlatformSetupAction(),
 		NewInitializeAction(),
 		newBuildKitAction(),
-		NewMonitorAction(),
+	}
+
+	if instance.IsSynthetic() {
+		actions = append(actions, NewMonitorSyntheticAction())
+	} else {
+		actions = append(actions, NewMonitorAction())
 	}
 
 	for _, a := range actions {
diff --git a/pkg/controller/integration/monitor.go b/pkg/controller/integration/monitor.go
index 9a6208fcb..048136d91 100644
--- a/pkg/controller/integration/monitor.go
+++ b/pkg/controller/integration/monitor.go
@@ -43,6 +43,7 @@ import (
 	utilResource "github.com/apache/camel-k/v2/pkg/util/resource"
 )
 
+// NewMonitorAction is an action used to monitor manager Integrations.
 func NewMonitorAction() Action {
 	return &monitorAction{}
 }
@@ -124,6 +125,37 @@ func (action *monitorAction) Handle(ctx context.Context, integration *v1.Integra
 		return nil, err
 	}
 
+	return action.monitorPods(ctx, environment, integration)
+}
+
+func (action *monitorAction) monitorPods(ctx context.Context, environment *trait.Environment, integration *v1.Integration) (*v1.Integration, error) {
+	controller, err := action.newController(environment, integration)
+	if err != nil {
+		return nil, err
+	}
+
+	// In order to simplify the monitoring and have a minor resource requirement, we will watch only those Pods
+	// which are labeled with `camel.apache.org/integration`. This is a design choice that requires the user to
+	// voluntarily add a label to their Pods (via template, possibly) in order to monitor the non managed Camel applications.
+
+	if !controller.hasTemplateIntegrationLabel() {
+		// This is happening when the Deployment, CronJob, etc resources
+		// miss the Integration label, required to identify sibling Pods.
+		integration.Status.SetConditions(
+			v1.IntegrationCondition{
+				Type:   v1.IntegrationConditionReady,
+				Status: corev1.ConditionFalse,
+				Reason: v1.IntegrationConditionMonitoringPodsAvailableReason,
+				Message: fmt.Sprintf(
+					"Could not find `camel.apache.org/integration: %s` label in the %s template. Make sure to include this label in the template for Pod monitoring purposes.",
+					integration.GetName(),
+					controller.getControllerName(),
+				),
+			},
+		)
+		return integration, nil
+	}
+
 	// Enforce the scale sub-resource label selector.
 	// It is used by the HPA that queries the scale sub-resource endpoint,
 	// to list the pods owned by the integration.
@@ -161,7 +193,7 @@ func (action *monitorAction) Handle(ctx context.Context, integration *v1.Integra
 		integration.Status.Phase = v1.IntegrationPhaseRunning
 	}
 	if err = action.updateIntegrationPhaseAndReadyCondition(
-		ctx, environment, integration, pendingPods.Items, runningPods.Items,
+		ctx, controller, environment, integration, pendingPods.Items, runningPods.Items,
 	); err != nil {
 		return nil, err
 	}
@@ -255,6 +287,8 @@ type controller interface {
 	checkReadyCondition(ctx context.Context) (bool, error)
 	getPodSpec() corev1.PodSpec
 	updateReadyCondition(readyPods int) bool
+	hasTemplateIntegrationLabel() bool
+	getControllerName() string
 }
 
 func (action *monitorAction) newController(env *trait.Environment, integration *v1.Integration) (controller, error) {
@@ -311,13 +345,9 @@ func getUpdatedController(env *trait.Environment, obj ctrl.Object) ctrl.Object {
 }
 
 func (action *monitorAction) updateIntegrationPhaseAndReadyCondition(
-	ctx context.Context, environment *trait.Environment, integration *v1.Integration,
+	ctx context.Context, controller controller, environment *trait.Environment, integration *v1.Integration,
 	pendingPods []corev1.Pod, runningPods []corev1.Pod,
 ) error {
-	controller, err := action.newController(environment, integration)
-	if err != nil {
-		return err
-	}
 	if done, err := controller.checkReadyCondition(ctx); done || err != nil {
 		// There may be pods that are not ready but still probable for getting error messages.
 		// Ignore returned error from probing as it's expected when the ctrl obj is not ready.
diff --git a/pkg/controller/integration/monitor_cronjob.go b/pkg/controller/integration/monitor_cronjob.go
index 1620a66c3..caa0a67a7 100644
--- a/pkg/controller/integration/monitor_cronjob.go
+++ b/pkg/controller/integration/monitor_cronjob.go
@@ -110,3 +110,11 @@ func (c *cronJobController) updateReadyCondition(readyPods int) bool {
 
 	return false
 }
+
+func (c *cronJobController) hasTemplateIntegrationLabel() bool {
+	return c.obj.Spec.JobTemplate.Spec.Template.Labels[v1.IntegrationLabel] != ""
+}
+
+func (c *cronJobController) getControllerName() string {
+	return fmt.Sprintf("CronJob/%s", c.obj.Name)
+}
diff --git a/pkg/controller/integration/monitor_deployment.go b/pkg/controller/integration/monitor_deployment.go
index e2f823c16..08b0c35e9 100644
--- a/pkg/controller/integration/monitor_deployment.go
+++ b/pkg/controller/integration/monitor_deployment.go
@@ -91,3 +91,11 @@ func (c *deploymentController) updateReadyCondition(readyPods int) bool {
 
 	return false
 }
+
+func (c *deploymentController) hasTemplateIntegrationLabel() bool {
+	return c.obj.Spec.Template.Labels[v1.IntegrationLabel] != ""
+}
+
+func (c *deploymentController) getControllerName() string {
+	return fmt.Sprintf("Deployment/%s", c.obj.Name)
+}
diff --git a/pkg/controller/integration/monitor_knative.go b/pkg/controller/integration/monitor_knative.go
index 06b7dc82b..1c7019598 100644
--- a/pkg/controller/integration/monitor_knative.go
+++ b/pkg/controller/integration/monitor_knative.go
@@ -19,6 +19,7 @@ package integration
 
 import (
 	"context"
+	"fmt"
 
 	corev1 "k8s.io/api/core/v1"
 
@@ -63,3 +64,11 @@ func (c *knativeServiceController) updateReadyCondition(readyPods int) bool {
 
 	return false
 }
+
+func (c *knativeServiceController) hasTemplateIntegrationLabel() bool {
+	return c.obj.Spec.Template.Labels[v1.IntegrationLabel] != ""
+}
+
+func (c *knativeServiceController) getControllerName() string {
+	return fmt.Sprintf("KnativeService/%s", c.obj.Name)
+}
diff --git a/pkg/controller/integration/monitor_synthetic.go b/pkg/controller/integration/monitor_synthetic.go
new file mode 100644
index 000000000..beb736b1d
--- /dev/null
+++ b/pkg/controller/integration/monitor_synthetic.go
@@ -0,0 +1,69 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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 integration
+
+import (
+	"context"
+
+	corev1 "k8s.io/api/core/v1"
+
+	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	"github.com/apache/camel-k/v2/pkg/trait"
+	k8serrors "k8s.io/apimachinery/pkg/api/errors"
+)
+
+// NewMonitorSyntheticAction is an action used to monitor synthetic Integrations.
+func NewMonitorSyntheticAction() Action {
+	return &monitorSyntheticAction{}
+}
+
+type monitorSyntheticAction struct {
+	monitorAction
+}
+
+func (action *monitorSyntheticAction) Name() string {
+	return "monitor-synthetic"
+}
+
+func (action *monitorSyntheticAction) Handle(ctx context.Context, integration *v1.Integration) (*v1.Integration, error) {
+	environment, err := trait.NewSyntheticEnvironment(ctx, action.client, integration, nil)
+	if err != nil {
+		// Importing application no longer available
+		if k8serrors.IsNotFound(err) {
+			// Application was deleted. The GC will take care of
+			return nil, nil
+		}
+		// other reasons, likely some error to report
+		integration.Status.Phase = v1.IntegrationPhaseError
+		integration.SetReadyCondition(corev1.ConditionFalse, v1.IntegrationConditionImportingKindAvailableReason, err.Error())
+		return integration, err
+	}
+
+	if environment == nil {
+		// The application which generated the Integration has no longer the importing label. We may have missed the
+		// delete event, therefore we need to perform the operation here.
+		err := action.client.Delete(ctx, integration)
+		action.L.Infof("Deleting synthetic Integration %s", integration.Name)
+		if err != nil {
+			return integration, err
+		}
+		return nil, nil
+	}
+
+	return action.monitorPods(ctx, environment, integration)
+}
diff --git a/pkg/controller/pipe/pipe_controller.go b/pkg/controller/pipe/pipe_controller.go
index 36da7fca1..5b174e435 100644
--- a/pkg/controller/pipe/pipe_controller.go
+++ b/pkg/controller/pipe/pipe_controller.go
@@ -66,7 +66,7 @@ func newReconciler(mgr manager.Manager, c client.Client) reconcile.Reconciler {
 }
 
 func add(mgr manager.Manager, r reconcile.Reconciler) error {
-	c, err := controller.New("kamelet-binding-controller", mgr, controller.Options{Reconciler: r})
+	c, err := controller.New("pipe-controller", mgr, controller.Options{Reconciler: r})
 	if err != nil {
 		return err
 	}
diff --git a/pkg/controller/synthetic/synthetic.go b/pkg/controller/synthetic/synthetic.go
new file mode 100644
index 000000000..974a2eb05
--- /dev/null
+++ b/pkg/controller/synthetic/synthetic.go
@@ -0,0 +1,294 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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 synthetic
+
+import (
+	"context"
+	"fmt"
+	"reflect"
+
+	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	"github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	"github.com/apache/camel-k/v2/pkg/client"
+	"github.com/apache/camel-k/v2/pkg/platform"
+	"github.com/apache/camel-k/v2/pkg/util/kubernetes"
+	"github.com/apache/camel-k/v2/pkg/util/log"
+	appsv1 "k8s.io/api/apps/v1"
+	batchv1 "k8s.io/api/batch/v1"
+	k8serrors "k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	clientgocache "k8s.io/client-go/tools/cache"
+	"knative.dev/serving/pkg/apis/serving"
+	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
+	"sigs.k8s.io/controller-runtime/pkg/cache"
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+var (
+	controller         = true
+	blockOwnerDeletion = true
+)
+
+// ManageSyntheticIntegrations is the controller for synthetic Integrations. Consider that the lifecycle of the objects are driven
+// by the way we are monitoring them. Since we're filtering by `camel.apache.org/integration` label in the cached client,
+// you must consider an add, update or delete
+// accordingly, ie, when the user label the resource, then it is considered as an add, when it removes the label, it is considered as a delete.
+// We must filter only non managed objects in order to avoid to conflict with the reconciliation loop of managed objects (owned by an Integration).
+func ManageSyntheticIntegrations(ctx context.Context, c client.Client, cache cache.Cache) error {
+	informers, err := getInformers(ctx, c, cache)
+	if err != nil {
+		return err
+	}
+	for _, informer := range informers {
+		_, err := informer.AddEventHandler(clientgocache.ResourceEventHandlerFuncs{
+			AddFunc: func(obj interface{}) {
+				ctrlObj, ok := obj.(ctrl.Object)
+				if !ok {
+					log.Error(fmt.Errorf("type assertion failed: %v", obj), "Failed to retrieve Object on add event")
+					return
+				}
+				if !isManagedObject(ctrlObj) {
+					integrationName := ctrlObj.GetLabels()[v1.IntegrationLabel]
+					it, err := getSyntheticIntegration(ctx, c, ctrlObj.GetNamespace(), integrationName)
+					if err != nil {
+						if k8serrors.IsNotFound(err) {
+							adapter, err := nonManagedCamelApplicationFactory(ctrlObj)
+							if err != nil {
+								log.Errorf(err, "Some error happened while creating a Camel application adapter for %s", integrationName)
+							}
+							if err = createSyntheticIntegration(ctx, c, adapter.Integration()); err != nil {
+								log.Errorf(err, "Some error happened while creating a synthetic Integration %s", integrationName)
+							}
+							log.Infof("Created a synthetic Integration %s after %s resource object", it.GetName(), ctrlObj.GetName())
+						} else {
+							log.Errorf(err, "Some error happened while loading a synthetic Integration %s", integrationName)
+						}
+					} else {
+						log.Infof("Synthetic Integration %s is in phase %s. Skipping.", integrationName, it.Status.Phase)
+					}
+				}
+			},
+			DeleteFunc: func(obj interface{}) {
+				ctrlObj, ok := obj.(ctrl.Object)
+				if !ok {
+					log.Error(fmt.Errorf("type assertion failed: %v", obj), "Failed to retrieve Object on delete event")
+					return
+				}
+				if !isManagedObject(ctrlObj) {
+					integrationName := ctrlObj.GetLabels()[v1.IntegrationLabel]
+					// Importing label removed
+					if err = deleteSyntheticIntegration(ctx, c, ctrlObj.GetNamespace(), integrationName); err != nil {
+						log.Errorf(err, "Some error happened while deleting a synthetic Integration %s", integrationName)
+					}
+					log.Infof("Deleted synthetic Integration %s", integrationName)
+				}
+			},
+		})
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func getInformers(ctx context.Context, cl client.Client, c cache.Cache) ([]cache.Informer, error) {
+	deploy, err := c.GetInformer(ctx, &appsv1.Deployment{})
+	if err != nil {
+		return nil, err
+	}
+	informers := []cache.Informer{deploy}
+	// Watch for the CronJob conditionally
+	if ok, err := kubernetes.IsAPIResourceInstalled(cl, batchv1.SchemeGroupVersion.String(), reflect.TypeOf(batchv1.CronJob{}).Name()); ok && err == nil {
+		cron, err := c.GetInformer(ctx, &batchv1.CronJob{})
+		if err != nil {
+			return nil, err
+		}
+		informers = append(informers, cron)
+	}
+	// Watch for the Knative Services conditionally
+	if ok, err := kubernetes.IsAPIResourceInstalled(cl, servingv1.SchemeGroupVersion.String(), reflect.TypeOf(servingv1.Service{}).Name()); ok && err == nil {
+		if ok, err := kubernetes.CheckPermission(ctx, cl, serving.GroupName, "services", platform.GetOperatorWatchNamespace(), "", "watch"); ok && err == nil {
+			ksvc, err := c.GetInformer(ctx, &servingv1.Service{})
+			if err != nil {
+				return nil, err
+			}
+			informers = append(informers, ksvc)
+		}
+	}
+
+	return informers, nil
+}
+
+func getSyntheticIntegration(ctx context.Context, c client.Client, namespace, name string) (*v1.Integration, error) {
+	it := v1.NewIntegration(namespace, name)
+	err := c.Get(ctx, ctrl.ObjectKeyFromObject(&it), &it)
+	return &it, err
+}
+
+func createSyntheticIntegration(ctx context.Context, c client.Client, it *v1.Integration) error {
+	return c.Create(ctx, it, ctrl.FieldOwner("camel-k-operator"))
+}
+
+func deleteSyntheticIntegration(ctx context.Context, c client.Client, namespace, name string) error {
+	// As the Integration label was removed, we don't know which is the Synthetic integration to remove
+	it := v1.NewIntegration(namespace, name)
+	return c.Delete(ctx, &it)
+}
+
+// isManagedObject returns true if the object is managed by an Integration.
+func isManagedObject(obj ctrl.Object) bool {
+	for _, mr := range obj.GetOwnerReferences() {
+		if mr.APIVersion == "camel.apache.org/v1" &&
+			mr.Kind == "Integration" {
+			return true
+		}
+	}
+	return false
+}
+
+// nonManagedCamelApplicationAdapter represents a Camel application built and deployed outside the operator lifecycle.
+type nonManagedCamelApplicationAdapter interface {
+	// Integration return an Integration resource fed by the Camel application adapter.
+	Integration() *v1.Integration
+}
+
+func nonManagedCamelApplicationFactory(obj ctrl.Object) (nonManagedCamelApplicationAdapter, error) {
+	deploy, ok := obj.(*appsv1.Deployment)
+	if ok {
+		return &nonManagedCamelDeployment{deploy: deploy}, nil
+	}
+	cronjob, ok := obj.(*batchv1.CronJob)
+	if ok {
+		return &NonManagedCamelCronjob{cron: cronjob}, nil
+	}
+	ksvc, ok := obj.(*servingv1.Service)
+	if ok {
+		return &NonManagedCamelKnativeService{ksvc: ksvc}, nil
+	}
+	return nil, fmt.Errorf("unsupported %s object kind", obj.GetName())
+}
+
+// NonManagedCamelDeployment represents a regular Camel application built and deployed outside the operator lifecycle.
+type nonManagedCamelDeployment struct {
+	deploy *appsv1.Deployment
+}
+
+// Integration return an Integration resource fed by the Camel application adapter.
+func (app *nonManagedCamelDeployment) Integration() *v1.Integration {
+	it := v1.NewIntegration(app.deploy.Namespace, app.deploy.Labels[v1.IntegrationLabel])
+	it.SetAnnotations(map[string]string{
+		v1.IntegrationImportedNameLabel: app.deploy.Name,
+		v1.IntegrationImportedKindLabel: "Deployment",
+		v1.IntegrationSyntheticLabel:    "true",
+	})
+	it.Spec = v1.IntegrationSpec{
+		Traits: v1.Traits{
+			Container: &trait.ContainerTrait{
+				Name: app.getContainerNameFromDeployment(),
+			},
+		},
+	}
+	references := []metav1.OwnerReference{
+		{
+			APIVersion:         "apps/v1",
+			Kind:               "Deployment",
+			Name:               app.deploy.Name,
+			UID:                app.deploy.UID,
+			Controller:         &controller,
+			BlockOwnerDeletion: &blockOwnerDeletion,
+		},
+	}
+	it.SetOwnerReferences(references)
+	return &it
+}
+
+// getContainerNameFromDeployment returns the container name which is running the Camel application.
+func (app *nonManagedCamelDeployment) getContainerNameFromDeployment() string {
+	firstContainerName := ""
+	for _, ct := range app.deploy.Spec.Template.Spec.Containers {
+		// set as fallback if no container is named as the deployment
+		if firstContainerName == "" {
+			firstContainerName = ct.Name
+		}
+		if ct.Name == app.deploy.Name {
+			return app.deploy.Name
+		}
+	}
+	return firstContainerName
+}
+
+// NonManagedCamelCronjob represents a cron Camel application built and deployed outside the operator lifecycle.
+type NonManagedCamelCronjob struct {
+	cron *batchv1.CronJob
+}
+
+// Integration return an Integration resource fed by the Camel application adapter.
+func (app *NonManagedCamelCronjob) Integration() *v1.Integration {
+	it := v1.NewIntegration(app.cron.Namespace, app.cron.Labels[v1.IntegrationLabel])
+	it.SetAnnotations(map[string]string{
+		v1.IntegrationImportedNameLabel: app.cron.Name,
+		v1.IntegrationImportedKindLabel: "CronJob",
+		v1.IntegrationSyntheticLabel:    "true",
+	})
+	it.Spec = v1.IntegrationSpec{
+		Traits: v1.Traits{},
+	}
+	references := []metav1.OwnerReference{
+		{
+			APIVersion:         "batch/v1",
+			Kind:               "CronJob",
+			Name:               app.cron.Name,
+			UID:                app.cron.UID,
+			Controller:         &controller,
+			BlockOwnerDeletion: &blockOwnerDeletion,
+		},
+	}
+	it.SetOwnerReferences(references)
+	return &it
+}
+
+// NonManagedCamelKnativeService represents a Knative Service based Camel application built and deployed outside the operator lifecycle.
+type NonManagedCamelKnativeService struct {
+	ksvc *servingv1.Service
+}
+
+// Integration return an Integration resource fed by the Camel application adapter.
+func (app *NonManagedCamelKnativeService) Integration() *v1.Integration {
+	it := v1.NewIntegration(app.ksvc.Namespace, app.ksvc.Labels[v1.IntegrationLabel])
+	it.SetAnnotations(map[string]string{
+		v1.IntegrationImportedNameLabel: app.ksvc.Name,
+		v1.IntegrationImportedKindLabel: "KnativeService",
+		v1.IntegrationSyntheticLabel:    "true",
+	})
+	it.Spec = v1.IntegrationSpec{
+		Traits: v1.Traits{},
+	}
+	references := []metav1.OwnerReference{
+		{
+			APIVersion:         servingv1.SchemeGroupVersion.String(),
+			Kind:               "Service",
+			Name:               app.ksvc.Name,
+			UID:                app.ksvc.UID,
+			Controller:         &controller,
+			BlockOwnerDeletion: &blockOwnerDeletion,
+		},
+	}
+	it.SetOwnerReferences(references)
+	return &it
+}
diff --git a/pkg/resources/resources.go b/pkg/resources/resources.go
index 72d549721..8601c5481 100644
--- a/pkg/resources/resources.go
+++ b/pkg/resources/resources.go
@@ -179,7 +179,7 @@ var assets = func() http.FileSystem {
 			modTime:          time.Time{},
 			uncompressedSize: 2981,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x56\x51\x6f\xe2\x46\x10\x7e\xf7\xaf\x18\xc1\xcb\x9d\x14\x20\xc9\xd3\xc9\x7d\x72\x03\xe9\xa1\xa6\x80\x30\xd7\xd3\x3d\x55\xc3\x7a\x80\x51\xd6\x3b\xee\xee\x18\x8e\xfe\xfa\x6a\x0d\x24\x98\x4b\xd2\x5e\x75\x52\xfd\x04\x3b\xb3\xdf\x7c\xf3\x7d\xb3\x5e\x77\xa1\xf7\xe3\x9e\xa4\x0b\x0f\x6c\xc8\x05\x2a\x40\x05\x74\x43\x90\x55\x68\x36\x04\xb9\xac\x74\x87\x9e\xe0\x5e\x6a\x57\xa0\xb2\x38\x78\x97\xe5\xf7\xef\xa1\x76\x05\x79\x10\x47\x20\x1e\x4a\xf1\x94\x74\xc1\x88\x53\xcf\xcb\x5a\xc5\x83\x3d\x00\x02\xae\x3d\x51\x49\x4e\x43\x1f\x20\x27\x6a\xd0\x27\xd3\xc5\xf8\x6e\x04\x2b\xb6\x04\x05\x87\xc3\x26\x2a\x60\xc7\xba\x49\xba\xa0\x1b\x0e\xb0\x13\xff\x08\x2b\xf1\x80\x45\xc1\xb1\x30\x5a\x60\xb7\x12\x5f\x1e\x68\x78\x5a\xa3\x2f\xd8\xad\xc1\x48\xb5\xf7\xbc\xde\x28\xc8\xce\x91\x0f\x1b\xae\xfa\x49\x17\x16\xb1\x8d\xfc\xfe\xc4\x24\x1c\x60\x9b\x9a\x2a\xf0\x45\xea\x63\x0f\x67\xed\x1e\x55\xb8\x82\xdf\xc9\x87\x58\xe4\xb6\x7f\x9d\x74\xe1\x5d\x4c\xe9\x1c\x83\x9d\xf7\x3f\xc1\x5e\x6a\x28\x71\x0f\x4e\x14\xea\x40\x67\xc8\xf4\xd5\x50\xa5\xc0\x0e\x8c\x94\x95\x65\x74\x86\x9e\xdb\x7a\xaa\xd0\x87\x86\x40\xc4\x90\xa5\x22\x3b\xc0\xa6\x0d\x90\xd5\x79\x1a\xa0\x26\xdd\xa4\x0b\xcd\xb3\x51\xad\xd2\xc1\x60\xb7\xdb\xf5\xb1\xa1\xdb\x17\xbf\x1e\x9c\xba\x1b\x3c\x8c\xef\x46\x93\x7c\xd4\x6b\x28\x27\x5d\xf8\xe4\x2c\x85\x00\x9e\xfe\xac\xd9\x53\x01\xcb\x3d\x60\x55\x59\x36\xb8\xb4\x04\x16\x77\xd1\xb8\xc6\x9d\xc6\x74\x76\xb0\xf3\xac\xec\xd6\x57\x10\x8e\xae\x27\xdd\x96\x3b\xcf\x72\x9d\xe8\x71\x68\x25\x88\x03\x74\xd0\xc9\x72\x18\xe7\x1d\xf8\x39\xcb\xc7\xf9\x55\xd2\x85\xcf\xe3\xc5\xc7\xe9\xa7\x05\x7c\xce\xe6\xf3\x6c\xb2\x18\x8f\x72\x98\xce\xe1\x6e\x3a\x19\x8e\x17\xe3\xe9\x24\x87\xe9\x3d\x64\x93\x2f\xf0\xeb\x78\x32\xbc\x02\x62\xdd\x90\x07\xfa\x5a\xf9\xc8\x5f\x3c\x70\x14\x92\x8a\xe8\xe9\x69\x80\x4e\x04\xe2\x7c\xc4\xff\xa1\x22\xc3\x2b\x36\x60\xd1\xad\x6b\x5c\x13\xac\x65\x4b\xde\xc5\xf1\xa8\xc8\x97\x1c\xa2\x9d\x01\xd0\x15\x49\x17\x2c\x97\xac\xcd\x14\x85\x6f\x9b\x8a\x65\x7e\xe4\xd9\x4a\xb0\xe2\xe3\x38\xa5\xd1\x81\x30\xd8\xde\x24\x8f\xec\x8a\x14\x86\x54\x59\xd9\xc7\xc3\x91\x94\xa4\x58\xa0\x62\x9a\x00\x38\x2c\x29\x05\x83\x25\xd9\xde\x63\x4f\x2a\xf2\xa8\xe2\x13\x00\x8b\x4b\xb2\x21\xa6\x40\x44\x4a\xa1\x73\x4c\xea\x34\x4b\xcd\x9f\xf3\xd9\x88\x23\x28\x8e\x9c\xa6\x70\x86\xf2\x46\x81\x06\xb6\xff\x58\x2f\xc9\x3b\x52\x0a\x7d\x96\x57\x41\xbe\xcd\x6c\xc1\xbe\x92\xb3\x3d\x29\xd1\xb9\xed\xdf\xf6\xaf\x7b\xf9\x24\x9b\xe5\x1f\xa7\x8b\x4e\x12\x2d\x8c\xad\x79\x6a\x86\x34\xa4\x70\x93\x00\x04\xf5\xa8\xb4\xde\x1f\x9a\xd6\x7d\x45\x29\xcc\xc9\x78\x42\xa5\x18\x26\x4b\x46\xc5\x1f\xc2\x25\xaa\xd9\x3c\x9c\x89\xf4\x46\xab\x4a\x65\x65\x51\xe9\xb8\xf3\x4c\xfe\xf8\xd8\x16\xc8\x9b\x8a\x7d\x97\xf2\xaf\x38\xf7\x7d\xca\xff\x5b\xf5\xbf\xd7\x81\x98\x7f\x72\xa1\xf9\x4d\x7e\xcb\x86\x32\x63\xa4\x76\x3a\x79\x4b\x82\xf8\xe6\x47\x8e\x2f\xdf\x67\xcd\x7a\xff\xa4\x1a\x00\x97\xb8\xa6\x14\x0a\x31\x8f\xe4\x23\xb9\x83\x84\x83\xe3\x96\xb4\xcd\xf0\x72\xe3\xac\xb6\x76\x26\x96\xcd\x3e\x85\xf1\x6a\x22\x3a\xf3\x14\xe2\x61\x7a\xce\x33\x52\x96\xe8\x8a\xf4\x6c\x29\x12\x7b\x8c\xf8\x17\x6b\x2f\xd0\xab\xc4\x6b\xb8\xdc\xfb\xd4\xea\x4c\xbc\xa6\xf0\xe1\xfa\xc3\x75\x2b\xe3\x34\x2c\x25\xa9\x67\x13\xce\x62\xe4\xb6\x97\x60\x87\xd4\xcf\xd9\xe2\xee\xe3\x1f\x93\xec\xb7\x51\x3e\xcb\xee\x46\x17\x70\x5b\xb4\x35\xdd\x7b\x29\xd3\x8b\x00\xc0\x8a\xc9\x16\x73\x5a\x7d\x1b\x39\xc6\x66\xa8\x9b\xf4\x69\xba\xfb\xb1\x5c\xa8\xd0\xd0\x8b\x34\xa6\xb3\xd1\x3c\x5b\x4c\xe7\x0d\x93\x97\x48\xbc\x34\xb6\x2f\x02\x8c\x87\xff\x65\xfb\x6c\x3a\x7c\xb5\xf4\x8f\xeb\xbf\x95\xda\x85\x27\xd5\xe3\x65\x86\x76\x87\xfb\xd0\xdc\x06\xa7\x71\x80\x27\xcd\xae\x80\x5d\x41\x15\xb9\x82\x9c\xda\xe6\xaa\x7e\xcb\xb8\x53\x57\xff\x93\xad\x96\xb7\xe4\x28\x84\x99\x97\x25\xb5\x81\xe2\x87\xc4\x2f\xa4\x97\xe8\x55\x03\x3a\xd8\x10\x5a\xdd\xfc\x75\x19\x3c\x0d\xfb\x4d\x2b\xc0\x8e\x95\xd1\x0e\xc9\xe2\x3e\x27\x23\xae\x08\x29\xdc\xb6\x0f\x44\x45\x9e\xa5\x78\x8a\xde\x9c\x47\x03\x99\xda\xb3\xee\xef\xc4\x29\x7d\xbd\xa0\xe4\x6b\x97\x85\x89\xb8\xb9\x88\xa6\xa0\xbe\x6e\x7b\x17\xc8\xc4\x37\xe4\xcc\x4b\xfc\xf2\xba\xec\xe6\x78\x55\xd4\x4e\xb9\xa4\x21\xad\xb0\xb6\xda\x4a\x41\x6b\x65\x37\xf3\xbc\x65\x4b\x6b\x1a\x05\x83\xb6\xf9\x24\x48\x61\x85\x36\xb4\x4b\x19\xac\x70\xc9\x96\x95\x29\x5c\x16\x2a\xbc\x54\x97\x6b\x3d\xc8\x1e\x1e\x92\xe4\xef\x00\x00\x00\xff\xff\x40\xb3\x4e\x19\xa5\x0b\x00\x00"),
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x56\x41\x73\xe2\x46\x13\xbd\xeb\x57\x74\xc1\x65\xb7\xca\x80\xbd\xdf\x65\x4b\xdf\x49\x31\x38\x4b\xc5\x01\x0a\xb1\xd9\xda\x53\xaa\x19\x35\xd0\xe5\xd1\xb4\x32\xd3\x82\x25\xbf\x3e\x35\x02\x6c\xc4\xda\x4e\x36\xe5\xaa\xe8\x04\xd3\x3d\xaf\x5f\xbf\xd7\xa3\x51\x17\x7a\x6f\xf7\x24\x5d\xb8\x67\x43\x2e\x50\x01\x2a\xa0\x1b\x82\xac\x42\xb3\x21\xc8\x65\xa5\x3b\xf4\x04\x77\x52\xbb\x02\x95\xc5\xc1\xbb\x2c\xbf\x7b\x0f\xb5\x2b\xc8\x83\x38\x02\xf1\x50\x8a\xa7\xa4\x0b\x46\x9c\x7a\x5e\xd6\x2a\x1e\xec\x01\x10\x70\xed\x89\x4a\x72\x1a\xfa\x00\x39\x51\x83\x3e\x99\x2e\xc6\xb7\x23\x58\xb1\x25\x28\x38\x1c\x36\x51\x01\x3b\xd6\x4d\xd2\x05\xdd\x70\x80\x9d\xf8\x07\x58\x89\x07\x2c\x0a\x8e\x85\xd1\x02\xbb\x95\xf8\xf2\x40\xc3\xd3\x1a\x7d\xc1\x6e\x0d\x46\xaa\xbd\xe7\xf5\x46\x41\x76\x8e\x7c\xd8\x70\xd5\x4f\xba\xb0\x88\x6d\xe4\x77\x27\x26\xe1\x00\xdb\xd4\x54\x81\xaf\x52\x1f\x7b\x38\x6b\xf7\xa8\xc2\x15\xfc\x46\x3e\xc4\x22\x1f\xfa\xd7\x49\x17\xde\xc5\x94\xce\x31\xd8\x79\xff\x7f\xd8\x4b\x0d\x25\xee\xc1\x89\x42\x1d\xe8\x0c\x99\xbe\x19\xaa\x14\xd8\x81\x91\xb2\xb2\x8c\xce\xd0\x53\x5b\x8f\x15\xfa\xd0\x10\x88\x18\xb2\x54\x64\x07\xd8\xb4\x01\xb2\x3a\x4f\x03\xd4\xa4\x9b\x74\xa1\x79\x36\xaa\x55\x3a\x18\xec\x76\xbb\x3e\x36\x74\xfb\xe2\xd7\x83\x53\x77\x83\xfb\xf1\xed\x68\x92\x8f\x7a\x0d\xe5\xa4\x0b\x9f\x9d\xa5\x10\xc0\xd3\x1f\x35\x7b\x2a\x60\xb9\x07\xac\x2a\xcb\x06\x97\x96\xc0\xe2\x2e\x1a\xd7\xb8\xd3\x98\xce\x0e\x76\x9e\x95\xdd\xfa\x0a\xc2\xd1\xf5\xa4\xdb\x72\xe7\x49\xae\x13\x3d\x0e\xad\x04\x71\x80\x0e\x3a\x59\x0e\xe3\xbc\x03\x3f\x65\xf9\x38\xbf\x4a\xba\xf0\x65\xbc\xf8\x34\xfd\xbc\x80\x2f\xd9\x7c\x9e\x4d\x16\xe3\x51\x0e\xd3\x39\xdc\x4e\x27\xc3\xf1\x62\x3c\x9d\xe4\x30\xbd\x83\x6c\xf2\x15\x7e\x19\x4f\x86\x57\x40\xac\x1b\xf2\x40\xdf\x2a\x1f\xf9\x8b\x07\x8e\x42\x52\x11\x3d\x3d\x0d\xd0\x89\x40\x9c\x8f\xf8\x3f\x54\x64\x78\xc5\x06\x2c\xba\x75\x8d\x6b\x82\xb5\x6c\xc9\xbb\x38\x1e\x15\xf9\x92\x43\xb4\x33\x00\xba\x22\xe9\x82\xe5\x92\xb5\x99\xa2\xf0\x7d\x53\xb1\xcc\x5b\x9e\xad\x04\x2b\x3e\x8e\x53\x1a\x1d\x08\x83\xed\x4d\xf2\xc0\xae\x48\x61\x48\x95\x95\x7d\x3c\x1c\x49\x49\x8a\x05\x2a\xa6\x09\x80\xc3\x92\x52\x30\x58\x92\xed\x3d\xf4\xa4\x22\x8f\x2a\x3e\x01\xb0\xb8\x24\x1b\x62\x0a\x44\xa4\x14\x3a\xc7\xa4\x4e\xb3\xd4\xfc\x39\x9f\x8d\x38\x82\xe2\xc8\x69\x0a\x67\x28\xaf\x14\x68\x60\xfb\x0f\xf5\x92\xbc\x23\xa5\xd0\x67\x79\x11\xe4\xfb\xcc\x16\xec\x0b\x39\xdb\x93\x12\x9d\x0f\xfd\xff\xf5\xaf\x7b\xf9\x24\x9b\xe5\x9f\xa6\x8b\x4e\x12\x2d\x8c\xad\x79\x6a\x86\x34\xa4\x70\x93\x00\x04\xf5\xa8\xb4\xde\x1f\x9a\xd6\x7d\x45\x29\xcc\xc9\x78\x42\xa5\x18\x26\x4b\x46\xc5\x1f\xc2\x25\xaa\xd9\xdc\x9f\x89\xf4\x4a\xab\x4a\x65\x65\x51\xe9\xb8\xf3\x4c\xfe\xf8\xd8\x16\xc8\xab\x8a\xfd\x90\xf2\x2f\x38\xf7\x63\xca\xff\x53\xf5\x7f\xd4\x81\x98\x7f\x72\xa1\xf9\x4d\x7e\xcb\x86\x32\x63\xa4\x76\x3a\x79\x4d\x82\xf8\xe6\x47\x8e\x2f\xdf\x27\xcd\x7a\x7f\xa7\x1a\x00\x97\xb8\xa6\x14\x0a\x31\x0f\xe4\x23\xb9\x83\x84\x83\xe3\x96\xb4\xcd\xf0\x72\xe3\xac\xb6\x76\x26\x96\xcd\x3e\x85\xf1\x6a\x22\x3a\xf3\x14\xe2\x61\x7a\xca\x33\x52\x96\xe8\x8a\xf4\x6c\x29\x12\x7b\x88\xf8\x17\x6b\xcf\xd0\xab\xc4\x6b\xb8\xdc\xfb\xd8\xea\x4c\xbc\xa6\xf0\xf1\xfa\xe3\x75\x2b\xe3\x34\x2c\x25\xa9\x67\x13\xce\x62\xe4\xb6\x97\x60\x87\xd4\x2f\xd9\xe2\xf6\xd3\xef\x93\xec\xd7\x51\x3e\xcb\x6e\x47\x17\x70\x5b\xb4\x35\xdd\x79\x29\xd3\x8b\x00\xc0\x8a\xc9\x16\x73\x5a\x7d\x1f\x39\xc6\x66\xa8\x9b\xf4\x71\xba\xfb\xb1\x5c\xa8\xd0\xd0\xb3\x34\xa6\xb3\xd1\x3c\x5b\x4c\xe7\x0d\x93\xe7\x48\x3c\x37\xb6\xcf\x02\x8c\x87\xff\x66\xfb\x6c\x3a\x7c\xb1\xf4\xdb\xf5\xdf\x4a\xed\xc2\xa3\xea\xf1\x32\x43\xbb\xc3\x7d\x68\x6e\x83\xd3\x38\xc0\xa3\x66\x57\xc0\xae\xa0\x8a\x5c\x41\x4e\x6d\x73\x55\xbf\x66\xdc\xa9\xab\xff\xc8\x56\xcb\x5b\x72\x14\xc2\xcc\xcb\x92\xda\x40\xf1\x43\xe2\x67\xd2\x4b\xf4\xaa\x01\x1d\x6c\x08\xad\x6e\xfe\xbc\x0c\x9e\x86\xfd\xa6\x15\x60\xc7\xca\x68\x87\x64\x71\x9f\x93\x11\x57\x84\x14\x3e\xb4\x0f\x44\x45\x9e\xa5\x78\x8c\xde\x9c\x47\x03\x99\xda\xb3\xee\x6f\xc5\x29\x7d\xbb\xa0\xe4\x6b\x97\x85\x89\xb8\xb9\x88\xa6\xa0\xbe\x6e\x7b\x17\xc8\xc4\x37\xe4\xcc\x4b\xfc\xf2\xba\xec\xe6\x78\x55\xd4\x4e\xb9\xa4\x21\xad\xb0\xb6\xda\x4a\x41\x6b\x65\x37\xf3\xbc\x65\x4b\x6b\x1a\x05\x83\xb6\xf9\x24\x48\x61\x85\x36\xb4\x4b\x19\xac\x70\xc9\x96\x95\x29\x5c\x16\x2a\xbc\x54\x97\x6b\x3d\xc8\xee\xef\x93\xe4\xaf\x00\x00\x00\xff\xff\xf7\x6f\x81\x92\xa5\x0b\x00\x00"),
 		},
 		"/manager/operator-service-account.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "operator-service-account.yaml",
diff --git a/pkg/trait/camel.go b/pkg/trait/camel.go
index 2a4e7b3f4..71a24550e 100644
--- a/pkg/trait/camel.go
+++ b/pkg/trait/camel.go
@@ -64,7 +64,8 @@ func (t *camelTrait) Configure(e *Environment) (bool, *TraitCondition, error) {
 		t.RuntimeVersion = determineRuntimeVersion(e)
 	}
 
-	return true, nil, nil
+	// Don't run this trait for a synthetic Integration
+	return e.Integration == nil || !e.Integration.IsSynthetic(), nil, nil
 }
 
 func (t *camelTrait) Apply(e *Environment) error {
diff --git a/pkg/trait/platform.go b/pkg/trait/platform.go
index 58e545597..ec3fb1e04 100644
--- a/pkg/trait/platform.go
+++ b/pkg/trait/platform.go
@@ -73,7 +73,8 @@ func (t *platformTrait) Configure(e *Environment) (bool, *TraitCondition, error)
 		}
 	}
 
-	return true, nil, nil
+	// Don't run this trait for a synthetic Integration
+	return e.Integration == nil || !e.Integration.IsSynthetic(), nil, nil
 }
 
 func (t *platformTrait) Apply(e *Environment) error {
diff --git a/pkg/trait/trait.go b/pkg/trait/trait.go
index 33676616f..059b294f1 100644
--- a/pkg/trait/trait.go
+++ b/pkg/trait/trait.go
@@ -24,13 +24,15 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	"github.com/apache/camel-k/v2/pkg/client"
 	"github.com/apache/camel-k/v2/pkg/platform"
 	"github.com/apache/camel-k/v2/pkg/util/kubernetes"
 	"github.com/apache/camel-k/v2/pkg/util/log"
-	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+	serving "knative.dev/serving/pkg/apis/serving/v1"
+	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 )
 
 func Apply(ctx context.Context, c client.Client, integration *v1.Integration, kit *v1.IntegrationKit) (*Environment, error) {
@@ -97,7 +99,7 @@ func newEnvironment(ctx context.Context, c client.Client, integration *v1.Integr
 		return nil, errors.New("neither integration nor kit are set")
 	}
 
-	var obj k8sclient.Object
+	var obj ctrl.Object
 	if integration != nil {
 		obj = integration
 	} else if kit != nil {
@@ -134,3 +136,73 @@ func newEnvironment(ctx context.Context, c client.Client, integration *v1.Integr
 
 	return &env, nil
 }
+
+// NewSyntheticEnvironment creates an environment suitable for a synthetic Integration. If the application which generated the synthetic Integration
+// has no longer the label, it will return a nil result.
+func NewSyntheticEnvironment(ctx context.Context, c client.Client, integration *v1.Integration, kit *v1.IntegrationKit) (*Environment, error) {
+	if integration == nil && kit == nil {
+		return nil, errors.New("neither integration nor kit are set")
+	}
+
+	env := Environment{
+		Ctx:                   ctx,
+		Platform:              nil,
+		Client:                c,
+		IntegrationKit:        kit,
+		Integration:           integration,
+		ExecutedTraits:        make([]Trait, 0),
+		Resources:             kubernetes.NewCollection(),
+		EnvVars:               make([]corev1.EnvVar, 0),
+		ApplicationProperties: make(map[string]string),
+	}
+
+	catalog := NewCatalog(c)
+	// set the catalog
+	env.Catalog = catalog
+	// we need to simulate the execution of the traits to fill certain values used later by monitoring
+	_, err := catalog.apply(&env)
+	if err != nil {
+		return nil, fmt.Errorf("error during trait customization: %w", err)
+	}
+	camelApp, err := getCamelAppObject(
+		ctx,
+		c,
+		integration.Annotations[v1.IntegrationImportedKindLabel],
+		integration.Namespace,
+		integration.Annotations[v1.IntegrationImportedNameLabel],
+	)
+	if err != nil {
+		return nil, err
+	}
+	// Verify if the application has still the expected label. If not, return nil.
+	if camelApp.GetLabels()[v1.IntegrationLabel] != integration.Name {
+		return nil, nil
+	}
+	env.Resources.Add(camelApp)
+
+	return &env, nil
+}
+
+func getCamelAppObject(ctx context.Context, c client.Client, kind, namespace, name string) (ctrl.Object, error) {
+	switch kind {
+	case "Deployment":
+		return c.AppsV1().Deployments(namespace).Get(ctx, name, metav1.GetOptions{})
+	case "CronJob":
+		return c.BatchV1().CronJobs(namespace).Get(ctx, name, metav1.GetOptions{})
+	case "KnativeService":
+		ksvc := &serving.Service{
+			TypeMeta: metav1.TypeMeta{
+				Kind:       "Service",
+				APIVersion: serving.SchemeGroupVersion.String(),
+			},
+			ObjectMeta: metav1.ObjectMeta{
+				Name:      name,
+				Namespace: namespace,
+			},
+		}
+		err := c.Get(ctx, ctrl.ObjectKeyFromObject(ksvc), ksvc)
+		return ksvc, err
+	default:
+		return nil, fmt.Errorf("cannot create a synthetic environment for %s kind", kind)
+	}
+}
diff --git a/pkg/util/dsl/flow.go b/pkg/util/dsl/flow.go
index 6fd4ad4cb..32569e30a 100644
--- a/pkg/util/dsl/flow.go
+++ b/pkg/util/dsl/flow.go
@@ -62,8 +62,9 @@ func ToYamlDSL(flows []v1.Flow) ([]byte, error) {
 		return nil, err
 	}
 	jsondata := make([]map[string]interface{}, 0)
-	err = json.Unmarshal(data, &jsondata)
-	if err != nil {
+	d := json.NewDecoder(bytes.NewReader(data))
+	d.UseNumber()
+	if err := d.Decode(&jsondata); err != nil {
 		return nil, fmt.Errorf("error unmarshalling json: %w", err)
 	}
 	yamldata, err := yaml2.Marshal(&jsondata)


Test patch:
diff --git a/e2e/commonwithcustominstall/files/deploy.yaml b/e2e/commonwithcustominstall/files/deploy.yaml
new file mode 100644
index 000000000..89921a04a
--- /dev/null
+++ b/e2e/commonwithcustominstall/files/deploy.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: v1
+data:
+  my-file.txt: hello
+kind: ConfigMap
+metadata:
+  name: my-cm
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  labels:
+    app: my-camel-sb-svc
+  name: my-camel-sb-svc
+spec:
+  progressDeadlineSeconds: 600
+  replicas: 1
+  revisionHistoryLimit: 10
+  selector:
+    matchLabels:
+      app: my-camel-sb-svc
+  strategy:
+    rollingUpdate:
+      maxSurge: 25%
+      maxUnavailable: 25%
+    type: RollingUpdate
+  template:
+    metadata:
+      labels:
+        app: my-camel-sb-svc
+    spec:
+      containers:
+      - image: docker.io/squakez/my-camel-sb-svc:1.0.0
+        imagePullPolicy: IfNotPresent
+        name: my-camel-sb-svc
+        resources: {}
+        terminationMessagePath: /dev/termination-log
+        terminationMessagePolicy: File
+        volumeMounts:
+        - name: my-cm
+          mountPath: /tmp/app/data
+      volumes:
+      - name: my-cm
+        configMap:
+          name: my-cm
+      dnsPolicy: ClusterFirst
+      restartPolicy: Always
+      schedulerName: default-scheduler
+      securityContext: {}
+      terminationGracePeriodSeconds: 30
diff --git a/e2e/commonwithcustominstall/synthetic_test.go b/e2e/commonwithcustominstall/synthetic_test.go
new file mode 100644
index 000000000..2979d0b39
--- /dev/null
+++ b/e2e/commonwithcustominstall/synthetic_test.go
@@ -0,0 +1,119 @@
+//go:build integration
+// +build integration
+
+// To enable compilation of this file in Goland, go to "Settings -> Go -> Vendoring & Build Tags -> Custom Tags" and add "integration"
+
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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 commonwithcustominstall
+
+import (
+	"testing"
+
+	. "github.com/onsi/gomega"
+
+	. "github.com/apache/camel-k/v2/e2e/support"
+	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	. "github.com/onsi/gomega/gstruct"
+	appsv1 "k8s.io/api/apps/v1"
+	corev1 "k8s.io/api/core/v1"
+)
+
+func TestSyntheticIntegrationOff(t *testing.T) {
+	RegisterTestingT(t)
+	WithNewTestNamespace(t, func(ns string) {
+		// Install Camel K without synthetic Integration feature variable (default)
+		operatorID := "camel-k-synthetic-env-off"
+		Expect(KamelInstallWithID(operatorID, ns).Execute()).To(Succeed())
+
+		// Run the external deployment
+		ExpectExecSucceed(t, Kubectl("apply", "-f", "files/deploy.yaml", "-n", ns))
+		Eventually(DeploymentCondition(ns, "my-camel-sb-svc", appsv1.DeploymentProgressing), TestTimeoutShort).
+			Should(MatchFields(IgnoreExtras, Fields{
+				"Status": Equal(corev1.ConditionTrue),
+				"Reason": Equal("NewReplicaSetAvailable"),
+			}))
+
+		// Label the deployment --> Verify the Integration is not created
+		ExpectExecSucceed(t, Kubectl("label", "deploy", "my-camel-sb-svc", "camel.apache.org/integration=my-it", "-n", ns))
+		Eventually(Integration(ns, "my-it"), TestTimeoutShort).Should(BeNil())
+	})
+}
+func TestSyntheticIntegrationFromDeployment(t *testing.T) {
+	RegisterTestingT(t)
+	WithNewTestNamespace(t, func(ns string) {
+		// Install Camel K with the synthetic Integration feature variable
+		operatorID := "camel-k-synthetic-env"
+		Expect(KamelInstallWithID(operatorID, ns,
+			"--operator-env-vars", "CAMEL_K_SYNTHETIC_INTEGRATIONS=true",
+		).Execute()).To(Succeed())
+
+		// Run the external deployment
+		ExpectExecSucceed(t, Kubectl("apply", "-f", "files/deploy.yaml", "-n", ns))
+		Eventually(DeploymentCondition(ns, "my-camel-sb-svc", appsv1.DeploymentProgressing), TestTimeoutShort).
+			Should(MatchFields(IgnoreExtras, Fields{
+				"Status": Equal(corev1.ConditionTrue),
+				"Reason": Equal("NewReplicaSetAvailable"),
+			}))
+
+		// Label the deployment --> Verify the Integration is created (cannot still monitor)
+		ExpectExecSucceed(t, Kubectl("label", "deploy", "my-camel-sb-svc", "camel.apache.org/integration=my-it", "-n", ns))
+		Eventually(IntegrationPhase(ns, "my-it"), TestTimeoutShort).Should(Equal(v1.IntegrationPhaseRunning))
+		Eventually(IntegrationConditionStatus(ns, "my-it", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionFalse))
+		Eventually(IntegrationCondition(ns, "my-it", v1.IntegrationConditionReady), TestTimeoutShort).Should(
+			WithTransform(IntegrationConditionReason, Equal(v1.IntegrationConditionMonitoringPodsAvailableReason)))
+
+		// Label the deployment template --> Verify the Integration is monitored
+		ExpectExecSucceed(t, Kubectl("patch", "deployment", "my-camel-sb-svc", "--patch", `{"spec": {"template": {"metadata": {"labels": {"camel.apache.org/integration": "my-it"}}}}}`, "-n", ns))
+		Eventually(IntegrationPhase(ns, "my-it"), TestTimeoutShort).Should(Equal(v1.IntegrationPhaseRunning))
+		Eventually(IntegrationConditionStatus(ns, "my-it", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+		one := int32(1)
+		Eventually(IntegrationStatusReplicas(ns, "my-it"), TestTimeoutShort).Should(Equal(&one))
+
+		// Delete the deployment --> Verify the Integration is eventually garbage collected
+		ExpectExecSucceed(t, Kubectl("delete", "deploy", "my-camel-sb-svc", "-n", ns))
+		Eventually(Integration(ns, "my-it"), TestTimeoutShort).Should(BeNil())
+
+		// Recreate the deployment and label --> Verify the Integration is monitored
+		ExpectExecSucceed(t, Kubectl("apply", "-f", "files/deploy.yaml", "-n", ns))
+		ExpectExecSucceed(t, Kubectl("label", "deploy", "my-camel-sb-svc", "camel.apache.org/integration=my-it", "-n", ns))
+		ExpectExecSucceed(t, Kubectl("patch", "deployment", "my-camel-sb-svc", "--patch", `{"spec": {"template": {"metadata": {"labels": {"camel.apache.org/integration": "my-it"}}}}}`, "-n", ns))
+		Eventually(IntegrationPhase(ns, "my-it"), TestTimeoutShort).Should(Equal(v1.IntegrationPhaseRunning))
+		Eventually(IntegrationConditionStatus(ns, "my-it", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+		Eventually(IntegrationStatusReplicas(ns, "my-it"), TestTimeoutShort).Should(Equal(&one))
+
+		// Remove label from the deployment --> Verify the Integration is deleted
+		ExpectExecSucceed(t, Kubectl("label", "deploy", "my-camel-sb-svc", "camel.apache.org/integration-", "-n", ns))
+		Eventually(Integration(ns, "my-it"), TestTimeoutShort).Should(BeNil())
+
+		// Add label back to the deployment --> Verify the Integration is created
+		ExpectExecSucceed(t, Kubectl("label", "deploy", "my-camel-sb-svc", "camel.apache.org/integration=my-it", "-n", ns))
+		Eventually(IntegrationPhase(ns, "my-it"), TestTimeoutShort).Should(Equal(v1.IntegrationPhaseRunning))
+		Eventually(IntegrationConditionStatus(ns, "my-it", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+		Eventually(IntegrationStatusReplicas(ns, "my-it"), TestTimeoutShort).Should(Equal(&one))
+		// Scale the deployment --> verify replicas are correctly set
+		ExpectExecSucceed(t, Kubectl("scale", "deploy", "my-camel-sb-svc", "--replicas", "2", "-n", ns))
+		two := int32(2)
+		Eventually(IntegrationStatusReplicas(ns, "my-it"), TestTimeoutShort).Should(Equal(&two))
+
+		// Delete Integration and deployments --> verify no Integration exists any longer
+		Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
+		ExpectExecSucceed(t, Kubectl("delete", "deploy", "my-camel-sb-svc", "-n", ns))
+		Eventually(Integration(ns, "my-it"), TestTimeoutShort).Should(BeNil())
+	})
+}
diff --git a/e2e/support/test_support.go b/e2e/support/test_support.go
index 4b67c6dc6..2743b050c 100644
--- a/e2e/support/test_support.go
+++ b/e2e/support/test_support.go
@@ -481,6 +481,14 @@ func MakeWithContext(ctx context.Context, rule string, args ...string) *exec.Cmd
 	return exec.Command("make", args...)
 }
 
+func Kubectl(args ...string) *exec.Cmd {
+	return KubectlWithContext(TestContext, args...)
+}
+
+func KubectlWithContext(ctx context.Context, args ...string) *exec.Cmd {
+	return exec.Command("kubectl", args...)
+}
+
 // =============================================================================
 // Curried utility functions for testing
 // =============================================================================
diff --git a/pkg/controller/integration/initialize_test.go b/pkg/controller/integration/initialize_test.go
new file mode 100644
index 000000000..2beaaa798
--- /dev/null
+++ b/pkg/controller/integration/initialize_test.go
@@ -0,0 +1,189 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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 integration
+
+import (
+	"context"
+	"testing"
+
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+
+	"github.com/apache/camel-k/v2/pkg/util/log"
+	"github.com/apache/camel-k/v2/pkg/util/test"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestCamelImportDeployment(t *testing.T) {
+	importedIt := &v1.Integration{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: v1.SchemeGroupVersion.String(),
+			Kind:       v1.IntegrationKind,
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-imported-it",
+			Annotations: map[string]string{
+				v1.IntegrationImportedNameLabel: "my-deploy",
+				v1.IntegrationSyntheticLabel:    "true",
+				v1.IntegrationImportedKindLabel: "Deployment",
+			},
+		},
+		Status: v1.IntegrationStatus{
+			Phase: v1.IntegrationPhaseInitialization,
+		},
+	}
+	c, err := test.NewFakeClient(importedIt)
+	assert.Nil(t, err)
+
+	a := initializeAction{}
+	a.InjectLogger(log.Log)
+	a.InjectClient(c)
+	assert.Equal(t, "initialize", a.Name())
+	assert.True(t, a.CanHandle(importedIt))
+	handledIt, err := a.Handle(context.TODO(), importedIt)
+	assert.Nil(t, err)
+	assert.Equal(t, v1.IntegrationPhaseRunning, handledIt.Status.Phase)
+	// Ready condition
+	assert.Equal(t, corev1.ConditionTrue, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Status)
+	assert.Equal(t, v1.IntegrationConditionDeploymentReadyReason, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Reason)
+	assert.Equal(t, "imported from my-deploy Deployment", handledIt.Status.GetCondition(v1.IntegrationConditionReady).Message)
+	// Deployment condition
+	assert.Equal(t, corev1.ConditionTrue, handledIt.Status.GetCondition(v1.IntegrationConditionDeploymentAvailable).Status)
+	assert.Equal(t, v1.IntegrationConditionDeploymentAvailableReason, handledIt.Status.GetCondition(v1.IntegrationConditionDeploymentAvailable).Reason)
+	assert.Equal(t, "imported from my-deploy Deployment", handledIt.Status.GetCondition(v1.IntegrationConditionDeploymentAvailable).Message)
+}
+
+func TestCamelImportCronJob(t *testing.T) {
+	importedIt := &v1.Integration{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: v1.SchemeGroupVersion.String(),
+			Kind:       v1.IntegrationKind,
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-imported-it",
+			Annotations: map[string]string{
+				v1.IntegrationImportedNameLabel: "my-cron",
+				v1.IntegrationSyntheticLabel:    "true",
+				v1.IntegrationImportedKindLabel: "CronJob",
+			},
+		},
+		Status: v1.IntegrationStatus{
+			Phase: v1.IntegrationPhaseInitialization,
+		},
+	}
+	c, err := test.NewFakeClient(importedIt)
+	assert.Nil(t, err)
+
+	a := initializeAction{}
+	a.InjectLogger(log.Log)
+	a.InjectClient(c)
+	assert.Equal(t, "initialize", a.Name())
+	assert.True(t, a.CanHandle(importedIt))
+	handledIt, err := a.Handle(context.TODO(), importedIt)
+	assert.Nil(t, err)
+	assert.Equal(t, v1.IntegrationPhaseRunning, handledIt.Status.Phase)
+	// Ready condition
+	assert.Equal(t, corev1.ConditionTrue, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Status)
+	assert.Equal(t, v1.IntegrationConditionDeploymentReadyReason, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Reason)
+	assert.Equal(t, "imported from my-cron CronJob", handledIt.Status.GetCondition(v1.IntegrationConditionReady).Message)
+	// CronJob condition
+	assert.Equal(t, corev1.ConditionTrue, handledIt.Status.GetCondition(v1.IntegrationConditionCronJobAvailable).Status)
+	assert.Equal(t, v1.IntegrationConditionCronJobCreatedReason, handledIt.Status.GetCondition(v1.IntegrationConditionCronJobAvailable).Reason)
+	assert.Equal(t, "imported from my-cron CronJob", handledIt.Status.GetCondition(v1.IntegrationConditionCronJobAvailable).Message)
+}
+
+func TestCamelImportKnativeService(t *testing.T) {
+	importedIt := &v1.Integration{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: v1.SchemeGroupVersion.String(),
+			Kind:       v1.IntegrationKind,
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-imported-it",
+			Annotations: map[string]string{
+				v1.IntegrationImportedNameLabel: "my-ksvc",
+				v1.IntegrationSyntheticLabel:    "true",
+				v1.IntegrationImportedKindLabel: "KnativeService",
+			},
+		},
+		Status: v1.IntegrationStatus{
+			Phase: v1.IntegrationPhaseInitialization,
+		},
+	}
+	c, err := test.NewFakeClient(importedIt)
+	assert.Nil(t, err)
+
+	a := initializeAction{}
+	a.InjectLogger(log.Log)
+	a.InjectClient(c)
+	assert.Equal(t, "initialize", a.Name())
+	assert.True(t, a.CanHandle(importedIt))
+	handledIt, err := a.Handle(context.TODO(), importedIt)
+	assert.Nil(t, err)
+	assert.Equal(t, v1.IntegrationPhaseRunning, handledIt.Status.Phase)
+	// Ready condition
+	assert.Equal(t, corev1.ConditionTrue, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Status)
+	assert.Equal(t, v1.IntegrationConditionKnativeServiceReadyReason, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Reason)
+	assert.Equal(t, "imported from my-ksvc KnativeService", handledIt.Status.GetCondition(v1.IntegrationConditionReady).Message)
+	// Knative Service condition
+	assert.Equal(t, corev1.ConditionTrue, handledIt.Status.GetCondition(v1.IntegrationConditionKnativeServiceAvailable).Status)
+	assert.Equal(t, v1.IntegrationConditionKnativeServiceAvailableReason, handledIt.Status.GetCondition(v1.IntegrationConditionKnativeServiceAvailable).Reason)
+	assert.Equal(t, "imported from my-ksvc KnativeService", handledIt.Status.GetCondition(v1.IntegrationConditionKnativeServiceAvailable).Message)
+}
+
+func TestCamelImportUnsupportedKind(t *testing.T) {
+	importedIt := &v1.Integration{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: v1.SchemeGroupVersion.String(),
+			Kind:       v1.IntegrationKind,
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-imported-it",
+			Annotations: map[string]string{
+				v1.IntegrationImportedNameLabel: "my-kind",
+				v1.IntegrationSyntheticLabel:    "true",
+				v1.IntegrationImportedKindLabel: "SomeKind",
+			},
+		},
+		Status: v1.IntegrationStatus{
+			Phase: v1.IntegrationPhaseInitialization,
+		},
+	}
+	c, err := test.NewFakeClient(importedIt)
+	assert.Nil(t, err)
+
+	a := initializeAction{}
+	a.InjectLogger(log.Log)
+	a.InjectClient(c)
+	assert.Equal(t, "initialize", a.Name())
+	assert.True(t, a.CanHandle(importedIt))
+	handledIt, err := a.Handle(context.TODO(), importedIt)
+	assert.Nil(t, err)
+	assert.Equal(t, v1.IntegrationPhaseError, handledIt.Status.Phase)
+	// Ready condition
+	assert.Equal(t, corev1.ConditionFalse, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Status)
+	assert.Equal(t, v1.IntegrationConditionImportingKindAvailableReason, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Reason)
+	assert.Equal(t, "Unsupported SomeKind import kind", handledIt.Status.GetCondition(v1.IntegrationConditionReady).Message)
+}
diff --git a/pkg/controller/integration/monitor_synthetic_test.go b/pkg/controller/integration/monitor_synthetic_test.go
new file mode 100644
index 000000000..b1cf8a66c
--- /dev/null
+++ b/pkg/controller/integration/monitor_synthetic_test.go
@@ -0,0 +1,486 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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 integration
+
+import (
+	"context"
+	"testing"
+
+	appsv1 "k8s.io/api/apps/v1"
+	batchv1 "k8s.io/api/batch/v1"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
+
+	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	"github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+
+	"github.com/apache/camel-k/v2/pkg/util/log"
+	"github.com/apache/camel-k/v2/pkg/util/test"
+
+	"github.com/stretchr/testify/assert"
+	"knative.dev/pkg/apis"
+	duckv1 "knative.dev/pkg/apis/duck/v1"
+)
+
+func TestMonitorSyntheticIntegrationImportingKindUnavailable(t *testing.T) {
+	importedIt := &v1.Integration{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: v1.SchemeGroupVersion.String(),
+			Kind:       v1.IntegrationKind,
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-imported-it",
+			Annotations: map[string]string{
+				v1.IntegrationImportedNameLabel: "my-deploy",
+				v1.IntegrationSyntheticLabel:    "true",
+				v1.IntegrationImportedKindLabel: "SomeKind",
+			},
+		},
+		Status: v1.IntegrationStatus{
+			Phase: v1.IntegrationPhaseRunning,
+		},
+	}
+	c, err := test.NewFakeClient(importedIt)
+	assert.Nil(t, err)
+
+	a := monitorSyntheticAction{}
+	a.InjectLogger(log.Log)
+	a.InjectClient(c)
+	assert.Equal(t, "monitor-synthetic", a.Name())
+	assert.True(t, a.CanHandle(importedIt))
+	handledIt, err := a.Handle(context.TODO(), importedIt)
+	assert.NotNil(t, err)
+	assert.Equal(t, v1.IntegrationPhaseError, handledIt.Status.Phase)
+	assert.Equal(t, corev1.ConditionFalse, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Status)
+	assert.Equal(t, v1.IntegrationConditionImportingKindAvailableReason, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Reason)
+	assert.Equal(t, "cannot create a synthetic environment for SomeKind kind", handledIt.Status.GetCondition(v1.IntegrationConditionReady).Message)
+}
+
+func TestMonitorSyntheticIntegrationCannotMonitorPods(t *testing.T) {
+	importedIt := &v1.Integration{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: v1.SchemeGroupVersion.String(),
+			Kind:       v1.IntegrationKind,
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-imported-it",
+			Annotations: map[string]string{
+				v1.IntegrationImportedNameLabel: "my-deploy",
+				v1.IntegrationSyntheticLabel:    "true",
+				v1.IntegrationImportedKindLabel: "Deployment",
+			},
+		},
+		Status: v1.IntegrationStatus{
+			Phase: v1.IntegrationPhaseRunning,
+			Conditions: []v1.IntegrationCondition{
+				{
+					Type:   v1.IntegrationConditionDeploymentAvailable,
+					Status: corev1.ConditionTrue,
+				},
+				{
+					Type:   v1.IntegrationConditionReady,
+					Status: corev1.ConditionTrue,
+				},
+			},
+		},
+	}
+	deploy := &appsv1.Deployment{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: appsv1.SchemeGroupVersion.String(),
+			Kind:       "Deployment",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-deploy",
+			Labels: map[string]string{
+				v1.IntegrationLabel: "my-imported-it",
+			},
+		},
+	}
+	c, err := test.NewFakeClient(importedIt, deploy)
+	assert.Nil(t, err)
+
+	a := monitorSyntheticAction{}
+	a.InjectLogger(log.Log)
+	a.InjectClient(c)
+	assert.Equal(t, "monitor-synthetic", a.Name())
+	assert.True(t, a.CanHandle(importedIt))
+	handledIt, err := a.Handle(context.TODO(), importedIt)
+	assert.Nil(t, err)
+	assert.Equal(t, corev1.ConditionFalse, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Status)
+	// Check monitoring pods condition
+	assert.Equal(t, v1.IntegrationConditionMonitoringPodsAvailableReason, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Reason)
+	assert.Equal(t, "Could not find `camel.apache.org/integration: my-imported-it` label in the Deployment/my-deploy template. Make sure to include this label in the template for Pod monitoring purposes.", handledIt.Status.GetCondition(v1.IntegrationConditionReady).Message)
+}
+
+func TestMonitorSyntheticIntegrationDeployment(t *testing.T) {
+	importedIt := &v1.Integration{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: v1.SchemeGroupVersion.String(),
+			Kind:       v1.IntegrationKind,
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-imported-it",
+			Annotations: map[string]string{
+				v1.IntegrationImportedNameLabel: "my-deploy",
+				v1.IntegrationSyntheticLabel:    "true",
+				v1.IntegrationImportedKindLabel: "Deployment",
+			},
+		},
+		Spec: v1.IntegrationSpec{
+			Traits: v1.Traits{
+				Container: &trait.ContainerTrait{
+					Name: "my-cnt",
+				},
+			},
+		},
+		Status: v1.IntegrationStatus{
+			Phase: v1.IntegrationPhaseRunning,
+			Conditions: []v1.IntegrationCondition{
+				{
+					Type:   v1.IntegrationConditionDeploymentAvailable,
+					Status: corev1.ConditionTrue,
+				},
+				{
+					Type:   v1.IntegrationConditionReady,
+					Status: corev1.ConditionTrue,
+				},
+			},
+		},
+	}
+	deploy := &appsv1.Deployment{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: appsv1.SchemeGroupVersion.String(),
+			Kind:       "Deployment",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-deploy",
+			Labels: map[string]string{
+				v1.IntegrationLabel: "my-imported-it",
+			},
+		},
+		Spec: appsv1.DeploymentSpec{
+			Template: corev1.PodTemplateSpec{
+				ObjectMeta: metav1.ObjectMeta{
+					Labels: map[string]string{
+						v1.IntegrationLabel: "my-imported-it",
+					},
+				},
+				Spec: corev1.PodSpec{
+					Containers: []corev1.Container{
+						{
+							Name:  "my-cnt",
+							Image: "my-img",
+						},
+					},
+				},
+			},
+		},
+	}
+	pod := &corev1.Pod{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: appsv1.SchemeGroupVersion.String(),
+			Kind:       "Pod",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-pod",
+			Labels: map[string]string{
+				v1.IntegrationLabel: "my-imported-it",
+			},
+		},
+		Spec: corev1.PodSpec{
+			Containers: []corev1.Container{
+				{
+					Name:  "my-cnt",
+					Image: "my-img",
+				},
+			},
+		},
+		Status: corev1.PodStatus{
+			Phase: corev1.PodRunning,
+			Conditions: []corev1.PodCondition{
+				{
+					Type:   corev1.PodReady,
+					Status: corev1.ConditionTrue,
+				},
+			},
+		},
+	}
+	c, err := test.NewFakeClient(importedIt, deploy, pod)
+	assert.Nil(t, err)
+
+	a := monitorSyntheticAction{}
+	a.InjectLogger(log.Log)
+	a.InjectClient(c)
+	assert.Equal(t, "monitor-synthetic", a.Name())
+	assert.True(t, a.CanHandle(importedIt))
+	handledIt, err := a.Handle(context.TODO(), importedIt)
+	assert.Nil(t, err)
+	assert.Equal(t, v1.IntegrationPhaseRunning, handledIt.Status.Phase)
+	assert.Equal(t, int32(1), *handledIt.Status.Replicas)
+	// Ready condition
+	assert.Equal(t, corev1.ConditionTrue, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Status)
+	assert.Equal(t, v1.IntegrationConditionDeploymentReadyReason, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Reason)
+	assert.Equal(t, "1/1 ready replicas", handledIt.Status.GetCondition(v1.IntegrationConditionReady).Message)
+
+	// Remove label from deployment
+	deploy.Labels = nil
+	c, err = test.NewFakeClient(importedIt, deploy)
+	assert.Nil(t, err)
+	a.InjectClient(c)
+	handledIt, err = a.Handle(context.TODO(), importedIt)
+	assert.Nil(t, err)
+	assert.Nil(t, handledIt)
+}
+
+func TestMonitorSyntheticIntegrationCronJob(t *testing.T) {
+	importedIt := &v1.Integration{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: v1.SchemeGroupVersion.String(),
+			Kind:       v1.IntegrationKind,
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-imported-it",
+			Annotations: map[string]string{
+				v1.IntegrationImportedNameLabel: "my-cron",
+				v1.IntegrationSyntheticLabel:    "true",
+				v1.IntegrationImportedKindLabel: "CronJob",
+			},
+		},
+		Status: v1.IntegrationStatus{
+			Phase: v1.IntegrationPhaseRunning,
+			Conditions: []v1.IntegrationCondition{
+				{
+					Type:   v1.IntegrationConditionCronJobAvailable,
+					Status: corev1.ConditionTrue,
+				},
+				{
+					Type:   v1.IntegrationConditionReady,
+					Status: corev1.ConditionTrue,
+				},
+			},
+		},
+	}
+	cron := &batchv1.CronJob{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: appsv1.SchemeGroupVersion.String(),
+			Kind:       "CronJob",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-cron",
+			Labels: map[string]string{
+				v1.IntegrationLabel: "my-imported-it",
+			},
+		},
+		Spec: batchv1.CronJobSpec{
+			JobTemplate: batchv1.JobTemplateSpec{
+				Spec: batchv1.JobSpec{
+					Template: corev1.PodTemplateSpec{
+						ObjectMeta: metav1.ObjectMeta{
+							Labels: map[string]string{
+								v1.IntegrationLabel: "my-imported-it",
+							},
+						},
+						Spec: corev1.PodSpec{
+							Containers: []corev1.Container{
+								{
+									Name:  "my-cnt",
+									Image: "my-img",
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+	}
+	pod := &corev1.Pod{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: appsv1.SchemeGroupVersion.String(),
+			Kind:       "Pod",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-pod",
+			Labels: map[string]string{
+				v1.IntegrationLabel: "my-imported-it",
+			},
+		},
+		Spec: corev1.PodSpec{
+			Containers: []corev1.Container{
+				{
+					Name:  "my-cnt",
+					Image: "my-img",
+				},
+			},
+		},
+		Status: corev1.PodStatus{
+			Phase: corev1.PodRunning,
+			Conditions: []corev1.PodCondition{
+				{
+					Type:   corev1.PodReady,
+					Status: corev1.ConditionTrue,
+				},
+			},
+		},
+	}
+	c, err := test.NewFakeClient(importedIt, cron, pod)
+	assert.Nil(t, err)
+
+	a := monitorSyntheticAction{}
+	a.InjectLogger(log.Log)
+	a.InjectClient(c)
+	assert.Equal(t, "monitor-synthetic", a.Name())
+	assert.True(t, a.CanHandle(importedIt))
+	handledIt, err := a.Handle(context.TODO(), importedIt)
+	assert.Nil(t, err)
+	assert.Equal(t, v1.IntegrationPhaseRunning, handledIt.Status.Phase)
+	assert.Equal(t, int32(1), *handledIt.Status.Replicas)
+	// Ready condition
+	assert.Equal(t, corev1.ConditionTrue, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Status)
+	assert.Equal(t, v1.IntegrationConditionCronJobCreatedReason, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Reason)
+	assert.Equal(t, "cronjob created", handledIt.Status.GetCondition(v1.IntegrationConditionReady).Message)
+}
+
+func TestMonitorSyntheticIntegrationKnativeService(t *testing.T) {
+	importedIt := &v1.Integration{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: v1.SchemeGroupVersion.String(),
+			Kind:       v1.IntegrationKind,
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-imported-it",
+			Annotations: map[string]string{
+				v1.IntegrationImportedNameLabel: "my-ksvc",
+				v1.IntegrationSyntheticLabel:    "true",
+				v1.IntegrationImportedKindLabel: "KnativeService",
+			},
+		},
+		Status: v1.IntegrationStatus{
+			Phase: v1.IntegrationPhaseRunning,
+			Conditions: []v1.IntegrationCondition{
+				{
+					Type:   v1.IntegrationConditionKnativeServiceAvailable,
+					Status: corev1.ConditionTrue,
+				},
+				{
+					Type:   v1.IntegrationConditionReady,
+					Status: corev1.ConditionTrue,
+				},
+			},
+		},
+	}
+	ksvc := &servingv1.Service{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: appsv1.SchemeGroupVersion.String(),
+			Kind:       "Service",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-ksvc",
+			Labels: map[string]string{
+				v1.IntegrationLabel: "my-imported-it",
+			},
+		},
+		Spec: servingv1.ServiceSpec{
+			ConfigurationSpec: servingv1.ConfigurationSpec{
+				Template: servingv1.RevisionTemplateSpec{
+					ObjectMeta: metav1.ObjectMeta{
+						Labels: map[string]string{
+							v1.IntegrationLabel: "my-imported-it",
+						},
+					},
+					Spec: servingv1.RevisionSpec{
+						PodSpec: corev1.PodSpec{
+							Containers: []corev1.Container{
+								{
+									Name:  "my-cnt",
+									Image: "my-img",
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+		Status: servingv1.ServiceStatus{
+			Status: duckv1.Status{
+				Conditions: duckv1.Conditions{
+					apis.Condition{
+						Type:   servingv1.ServiceConditionReady,
+						Status: corev1.ConditionTrue,
+					},
+				},
+			},
+		},
+	}
+	pod := &corev1.Pod{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: appsv1.SchemeGroupVersion.String(),
+			Kind:       "Pod",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-pod",
+			Labels: map[string]string{
+				v1.IntegrationLabel: "my-imported-it",
+			},
+		},
+		Spec: corev1.PodSpec{
+			Containers: []corev1.Container{
+				{
+					Name:  "my-cnt",
+					Image: "my-img",
+				},
+			},
+		},
+		Status: corev1.PodStatus{
+			Phase: corev1.PodRunning,
+			Conditions: []corev1.PodCondition{
+				{
+					Type:   corev1.PodReady,
+					Status: corev1.ConditionTrue,
+				},
+			},
+		},
+	}
+	c, err := test.NewFakeClient(importedIt, ksvc, pod)
+	assert.Nil(t, err)
+
+	a := monitorSyntheticAction{}
+	a.InjectLogger(log.Log)
+	a.InjectClient(c)
+	assert.Equal(t, "monitor-synthetic", a.Name())
+	assert.True(t, a.CanHandle(importedIt))
+	handledIt, err := a.Handle(context.TODO(), importedIt)
+	assert.Nil(t, err)
+	assert.Equal(t, v1.IntegrationPhaseRunning, handledIt.Status.Phase)
+	assert.Equal(t, int32(1), *handledIt.Status.Replicas)
+	// Ready condition
+	assert.Equal(t, corev1.ConditionTrue, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Status)
+	assert.Equal(t, v1.IntegrationConditionKnativeServiceReadyReason, handledIt.Status.GetCondition(v1.IntegrationConditionReady).Reason)
+}
diff --git a/pkg/controller/synthetic/synthetic_test.go b/pkg/controller/synthetic/synthetic_test.go
new file mode 100644
index 000000000..fcc15077a
--- /dev/null
+++ b/pkg/controller/synthetic/synthetic_test.go
@@ -0,0 +1,253 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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 synthetic
+
+import (
+	"testing"
+
+	appsv1 "k8s.io/api/apps/v1"
+	batchv1 "k8s.io/api/batch/v1"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
+
+	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	"github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestNonManagedUnsupported(t *testing.T) {
+	pod := &corev1.Pod{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: corev1.SchemeGroupVersion.String(),
+			Kind:       "Pod",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-pod",
+			Labels: map[string]string{
+				v1.IntegrationLabel: "my-imported-it",
+			},
+		},
+		Spec: corev1.PodSpec{
+			Containers: []corev1.Container{
+				{
+					Name:  "my-cnt",
+					Image: "my-img",
+				},
+			},
+		},
+		Status: corev1.PodStatus{
+			Phase: corev1.PodRunning,
+			Conditions: []corev1.PodCondition{
+				{
+					Type:   corev1.PodReady,
+					Status: corev1.ConditionTrue,
+				},
+			},
+		},
+	}
+
+	nilAdapter, err := nonManagedCamelApplicationFactory(pod)
+	assert.NotNil(t, err)
+	assert.Equal(t, "unsupported my-pod object kind", err.Error())
+	assert.Nil(t, nilAdapter)
+}
+
+func TestNonManagedDeployment(t *testing.T) {
+	deploy := &appsv1.Deployment{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: appsv1.SchemeGroupVersion.String(),
+			Kind:       "Deployment",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-deploy",
+			Labels: map[string]string{
+				v1.IntegrationLabel: "my-imported-it",
+			},
+		},
+		Spec: appsv1.DeploymentSpec{
+			Template: corev1.PodTemplateSpec{
+				ObjectMeta: metav1.ObjectMeta{
+					Labels: map[string]string{
+						v1.IntegrationLabel: "my-imported-it",
+					},
+				},
+				Spec: corev1.PodSpec{
+					Containers: []corev1.Container{
+						{
+							Name:  "my-cnt",
+							Image: "my-img",
+						},
+					},
+				},
+			},
+		},
+	}
+
+	expectedIt := v1.NewIntegration("ns", "my-imported-it")
+	expectedIt.SetAnnotations(map[string]string{
+		v1.IntegrationImportedNameLabel: "my-deploy",
+		v1.IntegrationImportedKindLabel: "Deployment",
+		v1.IntegrationSyntheticLabel:    "true",
+	})
+	expectedIt.Spec = v1.IntegrationSpec{
+		Traits: v1.Traits{
+			Container: &trait.ContainerTrait{
+				Name: "my-cnt",
+			},
+		},
+	}
+	references := []metav1.OwnerReference{
+		{
+			APIVersion:         "apps/v1",
+			Kind:               "Deployment",
+			Name:               deploy.Name,
+			UID:                deploy.UID,
+			Controller:         &controller,
+			BlockOwnerDeletion: &blockOwnerDeletion,
+		},
+	}
+	expectedIt.SetOwnerReferences(references)
+
+	deploymentAdapter, err := nonManagedCamelApplicationFactory(deploy)
+	assert.Nil(t, err)
+	assert.NotNil(t, deploymentAdapter)
+	assert.Equal(t, expectedIt, *deploymentAdapter.Integration())
+}
+
+func TestNonManagedCronJob(t *testing.T) {
+	cron := &batchv1.CronJob{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: batchv1.SchemeGroupVersion.String(),
+			Kind:       "CronJob",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-cron",
+			Labels: map[string]string{
+				v1.IntegrationLabel: "my-imported-it",
+			},
+		},
+		Spec: batchv1.CronJobSpec{
+			JobTemplate: batchv1.JobTemplateSpec{
+				Spec: batchv1.JobSpec{
+					Template: corev1.PodTemplateSpec{
+						ObjectMeta: metav1.ObjectMeta{
+							Labels: map[string]string{
+								v1.IntegrationLabel: "my-imported-it",
+							},
+						},
+						Spec: corev1.PodSpec{
+							Containers: []corev1.Container{
+								{
+									Name:  "my-cnt",
+									Image: "my-img",
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+	}
+
+	expectedIt := v1.NewIntegration("ns", "my-imported-it")
+	expectedIt.SetAnnotations(map[string]string{
+		v1.IntegrationImportedNameLabel: "my-cron",
+		v1.IntegrationImportedKindLabel: "CronJob",
+		v1.IntegrationSyntheticLabel:    "true",
+	})
+	references := []metav1.OwnerReference{
+		{
+			APIVersion:         "batch/v1",
+			Kind:               "CronJob",
+			Name:               cron.Name,
+			UID:                cron.UID,
+			Controller:         &controller,
+			BlockOwnerDeletion: &blockOwnerDeletion,
+		},
+	}
+	expectedIt.SetOwnerReferences(references)
+	cronJobAdapter, err := nonManagedCamelApplicationFactory(cron)
+	assert.Nil(t, err)
+	assert.NotNil(t, cronJobAdapter)
+	assert.Equal(t, expectedIt, *cronJobAdapter.Integration())
+}
+
+func TestNonManagedKnativeService(t *testing.T) {
+	ksvc := &servingv1.Service{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: servingv1.SchemeGroupVersion.String(),
+			Kind:       "Service",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-ksvc",
+			Labels: map[string]string{
+				v1.IntegrationLabel: "my-imported-it",
+			},
+		},
+		Spec: servingv1.ServiceSpec{
+			ConfigurationSpec: servingv1.ConfigurationSpec{
+				Template: servingv1.RevisionTemplateSpec{
+					ObjectMeta: metav1.ObjectMeta{
+						Labels: map[string]string{
+							v1.IntegrationLabel: "my-imported-it",
+						},
+					},
+					Spec: servingv1.RevisionSpec{
+						PodSpec: corev1.PodSpec{
+							Containers: []corev1.Container{
+								{
+									Name:  "my-cnt",
+									Image: "my-img",
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+	}
+
+	expectedIt := v1.NewIntegration("ns", "my-imported-it")
+	expectedIt.SetAnnotations(map[string]string{
+		v1.IntegrationImportedNameLabel: "my-ksvc",
+		v1.IntegrationImportedKindLabel: "KnativeService",
+		v1.IntegrationSyntheticLabel:    "true",
+	})
+	references := []metav1.OwnerReference{
+		{
+			APIVersion:         servingv1.SchemeGroupVersion.String(),
+			Kind:               "Service",
+			Name:               ksvc.Name,
+			UID:                ksvc.UID,
+			Controller:         &controller,
+			BlockOwnerDeletion: &blockOwnerDeletion,
+		},
+	}
+	expectedIt.SetOwnerReferences(references)
+
+	knativeServiceAdapter, err := nonManagedCamelApplicationFactory(ksvc)
+	assert.Nil(t, err)
+	assert.NotNil(t, knativeServiceAdapter)
+	assert.Equal(t, expectedIt, *knativeServiceAdapter.Integration())
+}
diff --git a/pkg/util/dsl/flow_test.go b/pkg/util/dsl/flow_test.go
index cd6cbcc9b..e67880f53 100644
--- a/pkg/util/dsl/flow_test.go
+++ b/pkg/util/dsl/flow_test.go
@@ -28,6 +28,8 @@ import (
 func TestReadWriteYaml(t *testing.T) {
 	// yaml in conventional form as marshalled by the go runtime
 	yaml := `- from:
+    parameters:
+      period: 3600001
     steps:
     - to: log:info
     uri: timer:tick
diff --git a/pkg/util/test/client.go b/pkg/util/test/client.go
index fef78d2b6..9105719eb 100644
--- a/pkg/util/test/client.go
+++ b/pkg/util/test/client.go
@@ -30,6 +30,7 @@ import (
 	camelv1alpha1 "github.com/apache/camel-k/v2/pkg/client/camel/clientset/versioned/typed/camel/v1alpha1"
 	"github.com/apache/camel-k/v2/pkg/util"
 	autoscalingv1 "k8s.io/api/autoscaling/v1"
+	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
@@ -55,7 +56,19 @@ func NewFakeClient(initObjs ...runtime.Object) (client.Client, error) {
 		return nil, err
 	}
 
-	c := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(initObjs...).Build()
+	c := fake.
+		NewClientBuilder().
+		WithScheme(scheme).
+		WithIndex(
+			&corev1.Pod{},
+			"status.phase",
+			func(obj controller.Object) []string {
+				pod, _ := obj.(*corev1.Pod)
+				return []string{string(pod.Status.Phase)}
+			},
+		).
+		WithRuntimeObjects(initObjs...).
+		Build()
 
 	camelClientset := fakecamelclientset.NewSimpleClientset(filterObjects(scheme, initObjs, func(gvk schema.GroupVersionKind) bool {
 		return strings.Contains(gvk.Group, "camel")