diff --git a/docs/development/core/public/kibana-plugin-core-public.applicationstart.applications_.md b/docs/development/core/public/kibana-plugin-core-public.applicationstart.applications_.md
new file mode 100644
index 0000000000000..d428faa500faf
--- /dev/null
+++ b/docs/development/core/public/kibana-plugin-core-public.applicationstart.applications_.md
@@ -0,0 +1,18 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [ApplicationStart](./kibana-plugin-core-public.applicationstart.md) > [applications$](./kibana-plugin-core-public.applicationstart.applications_.md)
+
+## ApplicationStart.applications$ property
+
+Observable emitting the list of currently registered apps and their associated status.
+
+Signature:
+
+```typescript
+applications$: Observable>;
+```
+
+## Remarks
+
+Applications disabled by [Capabilities](./kibana-plugin-core-public.capabilities.md) will not be present in the map. Applications manually disabled from the client-side using an [application updater](./kibana-plugin-core-public.appupdater.md) are present, with their status properly set as `inaccessible`.
+
diff --git a/docs/development/core/public/kibana-plugin-core-public.applicationstart.md b/docs/development/core/public/kibana-plugin-core-public.applicationstart.md
index 6f45bab3ebd2d..896de2de32dd5 100644
--- a/docs/development/core/public/kibana-plugin-core-public.applicationstart.md
+++ b/docs/development/core/public/kibana-plugin-core-public.applicationstart.md
@@ -15,6 +15,7 @@ export interface ApplicationStart
| Property | Type | Description |
| --- | --- | --- |
+| [applications$](./kibana-plugin-core-public.applicationstart.applications_.md) | Observable<ReadonlyMap<string, PublicAppInfo | PublicLegacyAppInfo>>
| Observable emitting the list of currently registered apps and their associated status. |
| [capabilities](./kibana-plugin-core-public.applicationstart.capabilities.md) | RecursiveReadonly<Capabilities>
| Gets the read-only capabilities. |
| [currentAppId$](./kibana-plugin-core-public.applicationstart.currentappid_.md) | Observable<string | undefined>
| An observable that emits the current application id and each subsequent id update. |
diff --git a/docs/development/core/public/kibana-plugin-core-public.legacyapp.appurl.md b/docs/development/core/public/kibana-plugin-core-public.legacyapp.appurl.md
new file mode 100644
index 0000000000000..292bf29962839
--- /dev/null
+++ b/docs/development/core/public/kibana-plugin-core-public.legacyapp.appurl.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [LegacyApp](./kibana-plugin-core-public.legacyapp.md) > [appUrl](./kibana-plugin-core-public.legacyapp.appurl.md)
+
+## LegacyApp.appUrl property
+
+Signature:
+
+```typescript
+appUrl: string;
+```
diff --git a/docs/development/core/public/kibana-plugin-core-public.legacyapp.disablesuburltracking.md b/docs/development/core/public/kibana-plugin-core-public.legacyapp.disablesuburltracking.md
new file mode 100644
index 0000000000000..af4d0eb7969d3
--- /dev/null
+++ b/docs/development/core/public/kibana-plugin-core-public.legacyapp.disablesuburltracking.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [LegacyApp](./kibana-plugin-core-public.legacyapp.md) > [disableSubUrlTracking](./kibana-plugin-core-public.legacyapp.disablesuburltracking.md)
+
+## LegacyApp.disableSubUrlTracking property
+
+Signature:
+
+```typescript
+disableSubUrlTracking?: boolean;
+```
diff --git a/docs/development/core/public/kibana-plugin-core-public.legacyapp.linktolastsuburl.md b/docs/development/core/public/kibana-plugin-core-public.legacyapp.linktolastsuburl.md
new file mode 100644
index 0000000000000..fa1314b74fd83
--- /dev/null
+++ b/docs/development/core/public/kibana-plugin-core-public.legacyapp.linktolastsuburl.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [LegacyApp](./kibana-plugin-core-public.legacyapp.md) > [linkToLastSubUrl](./kibana-plugin-core-public.legacyapp.linktolastsuburl.md)
+
+## LegacyApp.linkToLastSubUrl property
+
+Signature:
+
+```typescript
+linkToLastSubUrl?: boolean;
+```
diff --git a/docs/development/core/public/kibana-plugin-core-public.legacyapp.md b/docs/development/core/public/kibana-plugin-core-public.legacyapp.md
new file mode 100644
index 0000000000000..06533aaa99170
--- /dev/null
+++ b/docs/development/core/public/kibana-plugin-core-public.legacyapp.md
@@ -0,0 +1,22 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [LegacyApp](./kibana-plugin-core-public.legacyapp.md)
+
+## LegacyApp interface
+
+
+Signature:
+
+```typescript
+export interface LegacyApp extends AppBase
+```
+
+## Properties
+
+| Property | Type | Description |
+| --- | --- | --- |
+| [appUrl](./kibana-plugin-core-public.legacyapp.appurl.md) | string
| |
+| [disableSubUrlTracking](./kibana-plugin-core-public.legacyapp.disablesuburltracking.md) | boolean
| |
+| [linkToLastSubUrl](./kibana-plugin-core-public.legacyapp.linktolastsuburl.md) | boolean
| |
+| [subUrlBase](./kibana-plugin-core-public.legacyapp.suburlbase.md) | string
| |
+
diff --git a/docs/development/core/public/kibana-plugin-core-public.legacyapp.suburlbase.md b/docs/development/core/public/kibana-plugin-core-public.legacyapp.suburlbase.md
new file mode 100644
index 0000000000000..44a1e52ccd244
--- /dev/null
+++ b/docs/development/core/public/kibana-plugin-core-public.legacyapp.suburlbase.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [LegacyApp](./kibana-plugin-core-public.legacyapp.md) > [subUrlBase](./kibana-plugin-core-public.legacyapp.suburlbase.md)
+
+## LegacyApp.subUrlBase property
+
+Signature:
+
+```typescript
+subUrlBase?: string;
+```
diff --git a/docs/development/core/public/kibana-plugin-core-public.md b/docs/development/core/public/kibana-plugin-core-public.md
index b2524ec48c757..9e4afe0f5133c 100644
--- a/docs/development/core/public/kibana-plugin-core-public.md
+++ b/docs/development/core/public/kibana-plugin-core-public.md
@@ -90,6 +90,7 @@ The plugin integrates with the core system via lifecycle events: `setup`
| [IHttpResponseInterceptorOverrides](./kibana-plugin-core-public.ihttpresponseinterceptoroverrides.md) | Properties that can be returned by HttpInterceptor.request to override the response. |
| [ImageValidation](./kibana-plugin-core-public.imagevalidation.md) | |
| [IUiSettingsClient](./kibana-plugin-core-public.iuisettingsclient.md) | Client-side client that provides access to the advanced settings stored in elasticsearch. The settings provide control over the behavior of the Kibana application. For example, a user can specify how to display numeric or date fields. Users can adjust the settings via Management UI. [IUiSettingsClient](./kibana-plugin-core-public.iuisettingsclient.md) |
+| [LegacyApp](./kibana-plugin-core-public.legacyapp.md) | |
| [LegacyCoreSetup](./kibana-plugin-core-public.legacycoresetup.md) | Setup interface exposed to the legacy platform via the ui/new_platform
module. |
| [LegacyCoreStart](./kibana-plugin-core-public.legacycorestart.md) | Start interface exposed to the legacy platform via the ui/new_platform
module. |
| [LegacyNavLink](./kibana-plugin-core-public.legacynavlink.md) | |
@@ -162,6 +163,8 @@ The plugin integrates with the core system via lifecycle events: `setup`
| [NavType](./kibana-plugin-core-public.navtype.md) | |
| [PluginInitializer](./kibana-plugin-core-public.plugininitializer.md) | The plugin
export at the root of a plugin's public
directory should conform to this interface. |
| [PluginOpaqueId](./kibana-plugin-core-public.pluginopaqueid.md) | |
+| [PublicAppInfo](./kibana-plugin-core-public.publicappinfo.md) | Public information about a registered [application](./kibana-plugin-core-public.app.md) |
+| [PublicLegacyAppInfo](./kibana-plugin-core-public.publiclegacyappinfo.md) | Information about a registered [legacy application](./kibana-plugin-core-public.legacyapp.md) |
| [PublicUiSettingsParams](./kibana-plugin-core-public.publicuisettingsparams.md) | A sub-set of [UiSettingsParams](./kibana-plugin-core-public.uisettingsparams.md) exposed to the client-side. |
| [RecursiveReadonly](./kibana-plugin-core-public.recursivereadonly.md) | |
| [SavedObjectAttribute](./kibana-plugin-core-public.savedobjectattribute.md) | Type definition for a Saved Object attribute value |
diff --git a/docs/development/core/public/kibana-plugin-core-public.publicappinfo.md b/docs/development/core/public/kibana-plugin-core-public.publicappinfo.md
new file mode 100644
index 0000000000000..c70f3a97a8882
--- /dev/null
+++ b/docs/development/core/public/kibana-plugin-core-public.publicappinfo.md
@@ -0,0 +1,15 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [PublicAppInfo](./kibana-plugin-core-public.publicappinfo.md)
+
+## PublicAppInfo type
+
+Public information about a registered [application](./kibana-plugin-core-public.app.md)
+
+Signature:
+
+```typescript
+export declare type PublicAppInfo = Omit & {
+ legacy: false;
+};
+```
diff --git a/docs/development/core/public/kibana-plugin-core-public.publiclegacyappinfo.md b/docs/development/core/public/kibana-plugin-core-public.publiclegacyappinfo.md
new file mode 100644
index 0000000000000..cc3e9de3193cb
--- /dev/null
+++ b/docs/development/core/public/kibana-plugin-core-public.publiclegacyappinfo.md
@@ -0,0 +1,15 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [PublicLegacyAppInfo](./kibana-plugin-core-public.publiclegacyappinfo.md)
+
+## PublicLegacyAppInfo type
+
+Information about a registered [legacy application](./kibana-plugin-core-public.legacyapp.md)
+
+Signature:
+
+```typescript
+export declare type PublicLegacyAppInfo = Omit & {
+ legacy: true;
+};
+```
diff --git a/src/core/public/application/application_service.mock.ts b/src/core/public/application/application_service.mock.ts
index 24c0e66359afa..300b09e17d15d 100644
--- a/src/core/public/application/application_service.mock.ts
+++ b/src/core/public/application/application_service.mock.ts
@@ -25,8 +25,8 @@ import {
InternalApplicationStart,
ApplicationStart,
InternalApplicationSetup,
- App,
- LegacyApp,
+ PublicAppInfo,
+ PublicLegacyAppInfo,
} from './types';
import { ApplicationServiceContract } from './test_types';
@@ -47,6 +47,7 @@ const createStartContractMock = (): jest.Mocked => {
const currentAppId$ = new Subject();
return {
+ applications$: new BehaviorSubject