diff --git a/generators/client/files-angular.js b/generators/client/files-angular.js
new file mode 100644
index 00000000..3ca79d5c
--- /dev/null
+++ b/generators/client/files-angular.js
@@ -0,0 +1,39 @@
+/**
+ * Copyright 2013-2020 the original author or authors from the JHipster project.
+ *
+ * This file is part of the JHipster project, see https://www.jhipster.tech/
+ * for more information.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+const constants = require('generator-jhipster/generators/generator-constants');
+
+const { ANGULAR_DIR } = constants;
+
+const filesAngular = {
+ angularAdminModule: [
+ {
+ path: ANGULAR_DIR,
+ templates: [{ file: 'admin/health/health.component.html', method: 'processHtml' }, 'admin/health/health.service.ts']
+ }
+ ]
+};
+
+function writeFiles() {
+ this.writeFilesToDisk(filesAngular, this, false, 'angular');
+}
+
+module.exports = {
+ writeFiles,
+ files: filesAngular
+};
diff --git a/generators/client/files-react.js b/generators/client/files-react.js
new file mode 100644
index 00000000..9663b48a
--- /dev/null
+++ b/generators/client/files-react.js
@@ -0,0 +1,39 @@
+/**
+ * Copyright 2013-2020 the original author or authors from the JHipster project.
+ *
+ * This file is part of the JHipster project, see https://www.jhipster.tech/
+ * for more information.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+const constants = require('generator-jhipster/generators/generator-constants');
+
+const { REACT_DIR } = constants;
+
+const filesReact = {
+ adminModule: [
+ {
+ path: REACT_DIR,
+ templates: [{ file: 'modules/administration/health/health.tsx', method: 'processJsx' }]
+ }
+ ]
+};
+
+function writeFiles() {
+ this.writeFilesToDisk(filesReact, this, false, 'react');
+}
+
+module.exports = {
+ writeFiles,
+ files: filesReact
+};
diff --git a/generators/client/index.js b/generators/client/index.js
new file mode 100644
index 00000000..fb322ac8
--- /dev/null
+++ b/generators/client/index.js
@@ -0,0 +1,68 @@
+/* eslint-disable consistent-return */
+const chalk = require('chalk');
+const ClientGenerator = require('generator-jhipster/generators/client');
+const constants = require('generator-jhipster/generators/generator-constants');
+const writeAngularFiles = require('./files-angular').writeFiles;
+const writeReactFiles = require('./files-react').writeFiles;
+
+const { ANGULAR, REACT } = constants.SUPPORTED_CLIENT_FRAMEWORKS;
+
+module.exports = class extends ClientGenerator {
+ constructor(args, opts) {
+ super(args, { fromBlueprint: true, ...opts }); // fromBlueprint variable is important
+
+ const jhContext = (this.jhipsterContext = this.options.jhipsterContext);
+
+ if (!jhContext) {
+ this.error(`This is a JHipster blueprint and should be used only like ${chalk.yellow('jhipster --blueprint quarkus')}`);
+ }
+
+ this.configOptions = jhContext.configOptions || {};
+
+ // This sets up options for this sub generator and is being reused from JHipster
+ jhContext.setupClientOptions(this, jhContext);
+ }
+
+ get initializing() {
+ return super._initializing();
+ }
+
+ get prompting() {
+ return super._prompting();
+ }
+
+ get configuring() {
+ // Here we are not overriding this phase and hence its being handled by JHipster
+ return super._configuring();
+ }
+
+ get default() {
+ // Here we are not overriding this phase and hence its being handled by JHipster
+ return super._default();
+ }
+
+ get writing() {
+ const phaseFromJHipster = super._writing();
+ const phaseFromQuarkus = {
+ writeQuarkusFiles() {
+ if (this.skipClient) return;
+ if (this.clientFramework === ANGULAR) {
+ return writeAngularFiles.call(this);
+ }
+ if (this.clientFramework === REACT) {
+ return writeReactFiles.call(this);
+ }
+ }
+ };
+ return { ...phaseFromJHipster, ...phaseFromQuarkus };
+ }
+
+ get install() {
+ // Here we are not overriding this phase and hence its being handled by JHipster
+ return super._install();
+ }
+
+ get end() {
+ return super._end();
+ }
+};
diff --git a/generators/client/templates/angular/src/main/webapp/app/admin/health/health.component.html.ejs b/generators/client/templates/angular/src/main/webapp/app/admin/health/health.component.html.ejs
new file mode 100644
index 00000000..fbe548f9
--- /dev/null
+++ b/generators/client/templates/angular/src/main/webapp/app/admin/health/health.component.html.ejs
@@ -0,0 +1,56 @@
+<%#
+ Copyright 2013-2020 the original author or authors from the JHipster project.
+
+ This file is part of the JHipster project, see https://www.jhipster.tech/
+ for more information.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-%>
+
diff --git a/generators/client/templates/angular/src/main/webapp/app/admin/health/health.service.ts.ejs b/generators/client/templates/angular/src/main/webapp/app/admin/health/health.service.ts.ejs
new file mode 100644
index 00000000..c61eda05
--- /dev/null
+++ b/generators/client/templates/angular/src/main/webapp/app/admin/health/health.service.ts.ejs
@@ -0,0 +1,76 @@
+<%#
+ Copyright 2013-2020 the original author or authors from the JHipster project.
+
+ This file is part of the JHipster project, see https://www.jhipster.tech/
+ for more information.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-%>
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+import { SERVER_API_URL } from 'app/app.constants';
+
+export type HealthStatus = 'UP' | 'DOWN' | 'UNKNOWN' | 'OUT_OF_SERVICE';
+
+export type HealthKey =
+ <%_ if (messageBroker === 'kafka') { _%>
+ | 'binders'
+ <%_ } _%>
+ <%_ if (applicationType === 'gateway' || serviceDiscoveryType) { _%>
+ | 'discoveryComposite'
+ | 'refreshScope'
+ | 'clientConfigServer'
+ | 'hystrix'
+ <%_ } _%>
+ <%_ if (serviceDiscoveryType === 'consul') { _%>
+ | 'consul'
+ <%_ } _%>
+ | 'diskSpace'
+ | 'mail'
+ | 'ping'
+ <%_ if (searchEngine === 'elasticsearch') { _%>
+ | 'elasticsearch'
+ <%_ } _%>
+ <%_ if (databaseType === 'sql') { _%>
+ | 'db'
+ <%_ } else if (databaseType === 'mongodb') { _%>
+ | 'mongo'
+ <%_ } else if (databaseType === 'cassandra') { _%>
+ | 'cassandra'
+ <%_ } else if (databaseType === 'couchbase') { _%>
+ | 'couchbase'
+ <%_ } _%>
+ ;
+
+export interface Health {
+ status: HealthStatus;
+ checks: {
+ [key in HealthKey]?: HealthDetails;
+ };
+}
+
+export interface HealthDetails {
+ status: HealthStatus;
+ details: any;
+}
+
+@Injectable({ providedIn: 'root' })
+export class HealthService {
+ constructor(private http: HttpClient) {}
+
+ checkHealth(): Observable {
+ return this.http.get(SERVER_API_URL + 'management/health');
+ }
+}
diff --git a/generators/client/templates/react/src/main/webapp/app/modules/administration/health/health.tsx.ejs b/generators/client/templates/react/src/main/webapp/app/modules/administration/health/health.tsx.ejs
new file mode 100644
index 00000000..2c0b7a67
--- /dev/null
+++ b/generators/client/templates/react/src/main/webapp/app/modules/administration/health/health.tsx.ejs
@@ -0,0 +1,116 @@
+<%#
+ Copyright 2013-2020 the original author or authors from the JHipster project.
+
+ This file is part of the JHipster project, see https://www.jhipster.tech/
+ for more information.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-%>
+import React, { useState, useEffect } from 'react';
+import { connect } from 'react-redux';
+import { Translate } from 'react-jhipster';
+import { Table, Badge, Col, Row, Button } from 'reactstrap';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+
+import { IRootState } from 'app/shared/reducers';
+import { systemHealth } from '../administration.reducer';
+import HealthModal from './health-modal';
+
+export interface IHealthPageProps extends StateProps, DispatchProps {}
+
+export const HealthPage = (props: IHealthPageProps) => {
+ const [healthObject, setHealthObject] = useState({});
+ const [showModal, setShowModal] = useState(false);
+
+ useEffect(() => {
+ props.systemHealth();
+ }, []);
+
+ const getSystemHealth = () => {
+ if (!props.isFetching) {
+ props.systemHealth();
+ }
+ };
+
+ const getSystemHealthInfo = (name, healthObj) => () => {
+ setShowModal(true);
+ setHealthObject({ ...healthObj, name });
+ };
+
+ const handleClose = () => setShowModal(false);
+
+ const renderModal = () => ;
+
+ const { health, isFetching } = props;
+ const data = (health || {}).checks || {};
+
+ return (
+