diff --git a/ansible-role-requirements.yml b/ansible-role-requirements.yml
index 6629d4fdce..b03ebcd4ed 100644
--- a/ansible-role-requirements.yml
+++ b/ansible-role-requirements.yml
@@ -163,6 +163,11 @@
   src: https://git.openstack.org/openstack/openstack-ansible-os_octavia
   version: master
   trackbranch: master
+- name: os_panko
+  scm: git
+  src: https://git.openstack.org/openstack/openstack-ansible-os_panko
+  version: master
+  trackbranch: master
 - name: os_rally
   scm: git
   src: https://git.openstack.org/openstack/openstack-ansible-os_rally
diff --git a/deploy-guide/source/configure.rst b/deploy-guide/source/configure.rst
index 09ec363c53..d14dc6cddd 100644
--- a/deploy-guide/source/configure.rst
+++ b/deploy-guide/source/configure.rst
@@ -160,6 +160,8 @@ OpenStack service roles
 
 - :role_docs:`os_octavia`
 
+- :role_docs:`os_panko`
+
 - :role_docs:`os_rally`
 
 - :role_docs:`os_sahara`
diff --git a/doc/source/contributor/role-maturity-matrix.html b/doc/source/contributor/role-maturity-matrix.html
index b8ee73dec4..6c427ec04d 100644
--- a/doc/source/contributor/role-maturity-matrix.html
+++ b/doc/source/contributor/role-maturity-matrix.html
@@ -315,6 +315,15 @@
         <td>✘</td>
         <td>✘</td>
     </tr>
+    <tr class="warning">
+        <td>os_panko</td>
+        <td>Rocky</td>
+        <td>Inclubated</td>
+        <td>✔</td>
+        <td>✔</td>
+        <td>✘</td>
+        <td>✘</td>
+    </tr>
     <tr >
         <td>os_rally</td>
         <td>Newton</td>
@@ -475,4 +484,4 @@
         <td>pip_lock_down</td>
         <td>Liberty</td>
         <td>Newton</td>
-    </tr></table>
\ No newline at end of file
+    </tr></table>
diff --git a/etc/openstack_deploy/conf.d/panko.yml.aio b/etc/openstack_deploy/conf.d/panko.yml.aio
new file mode 100644
index 0000000000..003af0987e
--- /dev/null
+++ b/etc/openstack_deploy/conf.d/panko.yml.aio
@@ -0,0 +1,3 @@
+event-infra_hosts:
+  aio1:
+    ip: 172.29.236.100
diff --git a/etc/openstack_deploy/conf.d/panko.yml.example b/etc/openstack_deploy/conf.d/panko.yml.example
new file mode 100644
index 0000000000..9f4b98a644
--- /dev/null
+++ b/etc/openstack_deploy/conf.d/panko.yml.example
@@ -0,0 +1,8 @@
+# The infra nodes that will be running the event services
+event-infra_hosts:
+  infra1:
+    ip: 172.20.236.111
+  infra2:
+    ip: 172.20.236.112
+  infra3:
+    ip: 172.20.236.113
diff --git a/etc/openstack_deploy/env.d/aio_metal.yml.example b/etc/openstack_deploy/env.d/aio_metal.yml.example
index 67617205ff..dd0d0d07a5 100644
--- a/etc/openstack_deploy/env.d/aio_metal.yml.example
+++ b/etc/openstack_deploy/env.d/aio_metal.yml.example
@@ -90,6 +90,9 @@ container_skel:
   octavia_server_container:
     properties:
       is_metal: true
+  panko_container:
+    properties:
+      is_metal: true
   repo_container:
     properties:
       is_metal: true
diff --git a/etc/openstack_deploy/user_secrets.yml b/etc/openstack_deploy/user_secrets.yml
index a2246f313b..5627756bb7 100644
--- a/etc/openstack_deploy/user_secrets.yml
+++ b/etc/openstack_deploy/user_secrets.yml
@@ -270,3 +270,7 @@ congress_oslomsg_rpc_password:
 # your user variables.
 #congress_oslomsg_notify_password:
 congress_service_password:
+
+## panko passwords
+panko_container_db_password:
+panko_service_password:
diff --git a/inventory/env.d/panko.yml b/inventory/env.d/panko.yml
new file mode 100644
index 0000000000..80e374fe26
--- /dev/null
+++ b/inventory/env.d/panko.yml
@@ -0,0 +1,36 @@
+---
+# 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.
+
+component_skel:
+  panko_api:
+    belongs_to:
+      - panko_all
+
+container_skel:
+  panko_container:
+    belongs_to:
+      - event-infra_containers
+    contains:
+      - panko_api
+    properties:
+      service_name: panko
+
+physical_skel:
+  event-infra_containers:
+    belongs_to:
+      - all_containers
+  event-infra_hosts:
+    belongs_to:
+      - hosts
+
+
diff --git a/inventory/group_vars/all/panko.yml b/inventory/group_vars/all/panko.yml
new file mode 100644
index 0000000000..27157e77d3
--- /dev/null
+++ b/inventory/group_vars/all/panko.yml
@@ -0,0 +1,15 @@
+---
+#
+# 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.
+
+panko_service_region: "{{ service_region }}"
diff --git a/inventory/group_vars/haproxy/haproxy.yml b/inventory/group_vars/haproxy/haproxy.yml
index 14ffa05084..972c6e0cad 100644
--- a/inventory/group_vars/haproxy/haproxy.yml
+++ b/inventory/group_vars/haproxy/haproxy.yml
@@ -401,3 +401,14 @@ haproxy_default_services:
       haproxy_backend_options:
         - tcpka
       haproxy_service_enabled: "{{ (neutron_plugin_type == 'ml2.ovn') and (groups['neutron_ovn_northd'] is defined and groups['neutron_ovn_northd'] | length > 0) }}"
+  - service:
+      haproxy_service_name: panko_api
+      haproxy_backend_nodes: "{{ groups['panko_api'] | default([]) }}"
+      haproxy_ssl: "{{ haproxy_ssl }}"
+      haproxy_port: 8777
+      haproxy_balance_type: http
+      haproxy_backend_options:
+        - "forwardfor"
+        - "httpchk GET / HTTP/1.0\\r\\nUser-agent:\\ osa-haproxy-healthcheck"
+        - "httplog"
+      haproxy_service_enabled: "{{ groups['panko_all'] is defined and groups['panko_all'] | length > 0 }}"
diff --git a/inventory/group_vars/panko_all.yml b/inventory/group_vars/panko_all.yml
new file mode 100644
index 0000000000..185bfcb416
--- /dev/null
+++ b/inventory/group_vars/panko_all.yml
@@ -0,0 +1,24 @@
+---
+#
+# 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.
+
+
+panko_service_in_ldap: "{{ service_ldap_backend_enabled }}"
+panko_service_publicuri: "{{ openstack_service_publicuri_proto|default(panko_service_proto) }}://{{ external_lb_vip_address }}:{{ panko_service_port }}"
+
+# Ensure that the package state matches the global setting
+panko_package_state: "{{ package_state }}"
+
+# venv fetch configuration
+panko_venv_tag: "{{ venv_tag }}"
+panko_venv_download_url: "{{ venv_base_download_url }}/panko-{{ openstack_release }}-{{ ansible_architecture | lower }}.tgz"
diff --git a/inventory/inventory.ini b/inventory/inventory.ini
index 3e913e251a..41e843b15f 100644
--- a/inventory/inventory.ini
+++ b/inventory/inventory.ini
@@ -197,6 +197,9 @@ nova_scheduler
 
 [octavia_all]
 
+[panko_all:children]
+panko_api
+
 [rsyslog_all]
 
 [sahara_all:children]
diff --git a/playbooks/defaults/repo_packages/openstack_services.yml b/playbooks/defaults/repo_packages/openstack_services.yml
index 26628fa21e..2a5fe4f9c8 100644
--- a/playbooks/defaults/repo_packages/openstack_services.yml
+++ b/playbooks/defaults/repo_packages/openstack_services.yml
@@ -288,12 +288,20 @@ octavia_git_project_group: octavia_all
 octavia_git_track_branch: master
 
 
+## Panko service
+panko_git_repo: https://git.openstack.org/openstack/panko
+panko_git_install_branch: 91f809625560d770f39299f782eff2b56ec84874 # HEAD as of 23.03.2019
+panko_git_project_group: panko_all
+panko_git_track_branch: master
+
+
 ## Tacker service
 tacker_git_repo: https://git.openstack.org/openstack/tacker
 tacker_git_install_branch: 1a3c02772442a358baea762e9a67721efdd56595 # HEAD as of 23.03.2019
 tacker_git_project_group: tacker_all
 tacker_git_track_branch: master
 
+
 ## Congress service
 congress_git_repo: https://git.openstack.org/openstack/congress
 congress_git_install_branch: 030eed8c5519d44a69b3b458cf5169086852ae0d # HEAD as of 23.03.2019
diff --git a/playbooks/os-panko-install.yml b/playbooks/os-panko-install.yml
new file mode 100644
index 0000000000..14ad2f2ba3
--- /dev/null
+++ b/playbooks/os-panko-install.yml
@@ -0,0 +1,42 @@
+---
+#
+# 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.
+
+- name: Install the panko components
+  hosts: panko_all
+  gather_facts: "{{ osa_gather_facts | default(True) }}"
+  user: root
+  environment: "{{ deployment_environment_variables | default({}) }}"
+  vars_files:
+    - "defaults/repo_packages/openstack_services.yml"
+    - "defaults/{{ install_method }}_install.yml"
+  tags:
+    - panko
+  pre_tasks:
+    - include_tasks: "common-tasks/os-{{ container_tech | default('lxc') }}-container-setup.yml"
+      when: not is_metal
+
+    - include_tasks: common-tasks/os-log-dir-setup.yml
+      vars:
+        log_dirs:
+          - src: "/openstack/log/{{ inventory_hostname }}-panko"
+            dest: "/var/log/panko"
+  roles:
+    - role: "os_panko"
+
+  post_tasks:
+    - include_tasks: "common-tasks/rsyslog-client.yml"
+      vars:
+        rsyslog_client_log_rotate_file: panko_log_rotate
+        rsyslog_client_log_dir: "/var/log/panko"
+        rsyslog_client_config_name: "99-panko-rsyslog-client.conf"
diff --git a/playbooks/setup-openstack.yml b/playbooks/setup-openstack.yml
index 4d19711a59..dd859e4e17 100644
--- a/playbooks/setup-openstack.yml
+++ b/playbooks/setup-openstack.yml
@@ -26,6 +26,7 @@
 - import_playbook: os-swift-install.yml
 - import_playbook: os-ceilometer-install.yml
 - import_playbook: os-aodh-install.yml
+- import_playbook: os-panko-install.yml
 - import_playbook: os-ironic-install.yml
 - import_playbook: os-magnum-install.yml
 - import_playbook: os-trove-install.yml
diff --git a/tests/test_inventory.py b/tests/test_inventory.py
index 45d424cb55..b51d60a5fa 100644
--- a/tests/test_inventory.py
+++ b/tests/test_inventory.py
@@ -207,6 +207,9 @@ class TestAnsibleInventoryFormatConstraints(unittest.TestCase):
         'etcd_container',
         'etcd_containers',
         'etcd_hosts',
+        'event-infra_all',
+        'event-infra_containers',
+        'event-infra_hosts',
         'galera',
         'galera_all',
         'galera_container',
@@ -308,6 +311,9 @@ class TestAnsibleInventoryFormatConstraints(unittest.TestCase):
         'octavia-health-manager',
         'octavia-infra_containers',
         'octavia-infra_all',
+        'panko_all',
+        'panko_api',
+        'panko_container',
         'policy_all',
         'policy_containers',
         'policy_hosts',