diff --git a/ansible/inventory/all-in-one b/ansible/inventory/all-in-one
index f9c6de918bea49599bfdd0a52b787d979afd4a58..58ee74b83149dd787ca8455de0928daa5db33528 100644
--- a/ansible/inventory/all-in-one
+++ b/ansible/inventory/all-in-one
@@ -574,3 +574,9 @@ skydive
 compute
 network
 
+# Tacker
+[tacker-server:children]
+tacker
+
+[tacker-conductor:children]
+tacker
diff --git a/ansible/inventory/multinode b/ansible/inventory/multinode
index c319219ce3d07fbc330f329d35c3ab9cb5446b0e..6bb1a49b2c17b09ce4dfa33af6bd9e857a94fa51 100644
--- a/ansible/inventory/multinode
+++ b/ansible/inventory/multinode
@@ -591,3 +591,10 @@ skydive
 [skydive-agent:children]
 compute
 network
+
+# Tacker
+[tacker-server:children]
+tacker
+
+[tacker-conductor:children]
+tacker
diff --git a/ansible/roles/common/templates/conf/filter/01-rewrite.conf.j2 b/ansible/roles/common/templates/conf/filter/01-rewrite.conf.j2
index 2ca4ab71c0ffe53dded2fb0bcd0cdd6cbf027139..956203f176f3ba7584373e456e3e0838d975a9d6 100644
--- a/ansible/roles/common/templates/conf/filter/01-rewrite.conf.j2
+++ b/ansible/roles/common/templates/conf/filter/01-rewrite.conf.j2
@@ -30,4 +30,5 @@
     rewriterule27 programname ^(gnocchi-api|gnocchi-statsd|gnocchi-metricd|gnocchi-upgrade)$ openstack_python
     rewriterule28 programname ^(ironic-api|ironic-conductor)$ openstack_python
     rewriterule29 programname ^(panko-api|panko-dbsync)$ openstack_python
+    rewriterule30 programname ^(tacker-server|tacker-conductor)$ openstack_python
 </match>
diff --git a/ansible/roles/tacker/defaults/main.yml b/ansible/roles/tacker/defaults/main.yml
index 297c71ad64acc74c6aca9518d03ca0e3bd975cb8..891f7cd0371e43c11579d029e4263f0aa660657e 100644
--- a/ansible/roles/tacker/defaults/main.yml
+++ b/ansible/roles/tacker/defaults/main.yml
@@ -2,13 +2,22 @@
 project_name: "tacker"
 
 tacker_services:
-  tacker:
-    container_name: "tacker"
-    group: "tacker"
+  tacker-server:
+    container_name: "tacker_server"
+    group: "tacker-server"
     enabled: true
-    image: "{{ tacker_image_full }}"
+    image: "{{ tacker_server_image_full }}"
     volumes:
-      - "{{ node_config_directory }}/tacker/:{{ container_config_directory }}/:ro"
+      - "{{ node_config_directory }}/tacker-server/:{{ container_config_directory }}/:ro"
+      - "/etc/localtime:/etc/localtime:ro"
+      - "kolla_logs:/var/log/kolla/"
+  tacker-conductor:
+    container_name: "tacker_conductor"
+    group: "tacker-conductor"
+    enabled: true
+    image: "{{ tacker_conductor_image_full }}"
+    volumes:
+      - "{{ node_config_directory }}/tacker-conductor/:{{ container_config_directory }}/:ro"
       - "/etc/localtime:/etc/localtime:ro"
       - "kolla_logs:/var/log/kolla/"
 
@@ -22,9 +31,16 @@ tacker_database_address: "{{ kolla_internal_fqdn }}:{{ database_port }}"
 ########
 # Docker
 ########
-tacker_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_namespace }}/{{ kolla_base_distro }}-{{ kolla_install_type }}-tacker"
+tacker_install_type: "{{ kolla_install_type }}"
 tacker_tag: "{{ openstack_release }}"
-tacker_image_full: "{{ tacker_image }}:{{ tacker_tag }}"
+
+tacker_server_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_namespace }}/{{ kolla_base_distro }}-{{ tacker_install_type }}-tacker-server"
+tacker_server_tag: "{{ tacker_tag }}"
+tacker_server_image_full: "{{ tacker_server_image }}:{{ tacker_server_tag }}"
+
+tacker_conductor_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_namespace }}/{{ kolla_base_distro }}-{{ tacker_install_type }}-tacker-conductor"
+tacker_conductor_tag: "{{ tacker_tag }}"
+tacker_conductor_image_full: "{{ tacker_conductor_image }}:{{ tacker_conductor_tag }}"
 
 ####################
 # OpenStack
diff --git a/ansible/roles/tacker/handlers/main.yml b/ansible/roles/tacker/handlers/main.yml
index 718e26a4de64e4c01188a27c83e612b8a8723d4b..5cdef69a2376b46315fc0ba0175cca08c75b7789 100644
--- a/ansible/roles/tacker/handlers/main.yml
+++ b/ansible/roles/tacker/handlers/main.yml
@@ -1,12 +1,12 @@
 ---
-- name: Restart tacker container
+- name: Restart tacker-conductor container
   vars:
-    service_name: "tacker"
+    service_name: "tacker-conductor"
     service: "{{ tacker_services[service_name] }}"
     config_json: "{{ tacker_config_jsons.results|selectattr('item.key', 'equalto', service_name)|first }}"
     tacker_conf: "{{ tacker_confs.results|selectattr('item.key', 'equalto', service_name)|first  }}"
     policy_json: "{{ tacker_policy_jsons.results|selectattr('item.key', 'equalto', service_name)|first }}"
-    tacker_container: "{{ check_tacker_containers.results|selectattr('item.key', 'equalto', service_name)|first }}"
+    tacker_conductor_container: "{{ check_tacker_containers.results|selectattr('item.key', 'equalto', service_name)|first }}"
   kolla_docker:
     action: "recreate_or_restart_container"
     common_options: "{{ docker_common_options }}"
@@ -20,4 +20,27 @@
     - config_json.changed | bool
       or tacker_conf.changed | bool
       or policy_json.changed | bool
-      or tacker_container.changed | bool
+      or tacker_conductor_container.changed | bool
+
+- name: Restart tacker-server container
+  vars:
+    service_name: "tacker-server"
+    service: "{{ tacker_services[service_name] }}"
+    config_json: "{{ tacker_config_jsons.results|selectattr('item.key', 'equalto', service_name)|first }}"
+    tacker_conf: "{{ tacker_confs.results|selectattr('item.key', 'equalto', service_name)|first  }}"
+    policy_json: "{{ tacker_policy_jsons.results|selectattr('item.key', 'equalto', service_name)|first }}"
+    tacker_server_container: "{{ check_tacker_containers.results|selectattr('item.key', 'equalto', service_name)|first }}"
+  kolla_docker:
+    action: "recreate_or_restart_container"
+    common_options: "{{ docker_common_options }}"
+    name: "{{ service.container_name }}"
+    image: "{{ service.image }}"
+    volumes: "{{ service.volumes|reject('equalto', '')|list }}"
+  when:
+    - action != "config"
+    - inventory_hostname in groups[service.group]
+    - service.enabled | bool
+    - config_json.changed | bool
+      or tacker_conf.changed | bool
+      or policy_json.changed | bool
+      or tacker_server_container.changed | bool
diff --git a/ansible/roles/tacker/tasks/bootstrap.yml b/ansible/roles/tacker/tasks/bootstrap.yml
index 96ce9a402d258e0b10b894135fbddc3a5e1b2fa2..2cf830713b02f71ddb92ca67ae813f66edfd3903 100644
--- a/ansible/roles/tacker/tasks/bootstrap.yml
+++ b/ansible/roles/tacker/tasks/bootstrap.yml
@@ -10,7 +10,7 @@
       name: "{{ tacker_database_name }}"
   register: database
   run_once: True
-  delegate_to: "{{ groups['tacker'][0] }}"
+  delegate_to: "{{ groups['tacker-server'][0] }}"
 
 - name: Creating tacker database user and setting permissions
   kolla_toolbox:
@@ -26,7 +26,7 @@
       priv: "{{ tacker_database_name }}.*:ALL"
       append_privs: "yes"
   run_once: True
-  delegate_to: "{{ groups['tacker'][0] }}"
+  delegate_to: "{{ groups['tacker-server'][0] }}"
 
 - include: bootstrap_service.yml
   when: database.changed
diff --git a/ansible/roles/tacker/tasks/bootstrap_service.yml b/ansible/roles/tacker/tasks/bootstrap_service.yml
index b81e2fccf117119007026bdd795a6168c72736e4..682623675581429857a7971100143990b5c54135 100644
--- a/ansible/roles/tacker/tasks/bootstrap_service.yml
+++ b/ansible/roles/tacker/tasks/bootstrap_service.yml
@@ -1,7 +1,7 @@
 ---
 - name: Running tacker bootstrap container
   vars:
-    tacker: "{{ tacker_services.tacker }}"
+    tacker_server: "{{ tacker_services['tacker-server'] }}"
   kolla_docker:
     action: "start_container"
     common_options: "{{ docker_common_options }}"
@@ -9,11 +9,11 @@
     environment:
       KOLLA_BOOTSTRAP:
       KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
-    image: "{{ tacker.image }}"
+    image: "{{ tacker_server.image }}"
     labels:
       BOOTSTRAP:
     name: "bootstrap_tacker"
     restart_policy: "never"
-    volumes: "{{ tacker.volumes|reject('equalto', '')|list }}"
+    volumes: "{{ tacker_server.volumes|reject('equalto', '')|list }}"
   run_once: True
-  delegate_to: "{{ groups[tacker.group][0] }}"
+  delegate_to: "{{ groups[tacker_server.group][0] }}"
diff --git a/ansible/roles/tacker/tasks/config.yml b/ansible/roles/tacker/tasks/config.yml
index fcfbc3416ca57e6c69a9e40f86e6fb855523cd76..6702bcd20c8cf412689b20bad34f50e0ea2812e9 100644
--- a/ansible/roles/tacker/tasks/config.yml
+++ b/ansible/roles/tacker/tasks/config.yml
@@ -19,7 +19,8 @@
     - inventory_hostname in groups[item.value.group]
     - item.value.enabled
   notify:
-    - Restart tacker container
+    - Restart tacker-server container
+    - Restart tacker-conductor container
 
 - name: Copying over tacker.conf
   vars:
@@ -40,7 +41,8 @@
     - inventory_hostname in groups[item.value.group]
     - item.value.enabled | bool
   notify:
-    - Restart tacker container
+    - Restart tacker-server container
+    - Restart tacker-conductor container
 
 - name: Check if policies shall be overwritten
   local_action: stat path="{{ node_custom_config }}/tacker/policy.json"
@@ -58,7 +60,8 @@
     - tacker_policy.stat.exists
   with_dict: "{{ tacker_services }}"
   notify:
-    - Restart tacker container
+    - Restart tacker-server containers
+    - Restart tacker-conductor container
 
 - name: Check tacker container
   kolla_docker:
@@ -73,4 +76,5 @@
   register: check_tacker_containers
   with_dict: "{{ tacker_services }}"
   notify:
-    - Restart tacker container
+    - Restart tacker-server container
+    - Restart tacker-conductor container
diff --git a/ansible/roles/tacker/tasks/deploy.yml b/ansible/roles/tacker/tasks/deploy.yml
index 864362ba5fb8a070250fd176c3f2802c9681b837..0b9233a0ae2d9011ecd555f6849a4f416d4e2ebb 100644
--- a/ansible/roles/tacker/tasks/deploy.yml
+++ b/ansible/roles/tacker/tasks/deploy.yml
@@ -1,9 +1,13 @@
 ---
 - include: register.yml
+  when: inventory_hostname in groups['tacker-server']
 
 - include: config.yml
+  when: inventory_hostname in groups['tacker-server'] or
+        inventory_hostname in groups['tacker-conductor']
 
 - include: bootstrap.yml
+  when: inventory_hostname in groups['tacker-server']
 
 - name: Flush handlers
   meta: flush_handlers
diff --git a/ansible/roles/tacker/tasks/precheck.yml b/ansible/roles/tacker/tasks/precheck.yml
index e381d072d3c74d78dc2df2313272da26b136470e..df60eaf6f861d8415087697b92f71ecf548d57f7 100644
--- a/ansible/roles/tacker/tasks/precheck.yml
+++ b/ansible/roles/tacker/tasks/precheck.yml
@@ -2,7 +2,7 @@
 - name: Get container facts
   kolla_container_facts:
     name:
-      - tacker
+      - tacker_server
   register: container_facts
 
 - name: Checking free port for Tacker Server
@@ -13,5 +13,5 @@
     timeout: 1
     state: stopped
   when:
-    - container_facts['tacker'] is not defined
-    - inventory_hostname in groups['tacker']
+    - container_facts['tacker_server'] is not defined
+    - inventory_hostname in groups['tacker-server']
diff --git a/ansible/roles/tacker/tasks/pull.yml b/ansible/roles/tacker/tasks/pull.yml
index c2062c774e1cddbf528b794d26091ff3264cf383..a467bcc328aac30f51eaacedc4a9f1cd2636a3b5 100644
--- a/ansible/roles/tacker/tasks/pull.yml
+++ b/ansible/roles/tacker/tasks/pull.yml
@@ -1,5 +1,5 @@
 ---
-- name: Pulling tacker image
+- name: Pulling tacker images
   kolla_docker:
     action: "pull_image"
     common_options: "{{ docker_common_options }}"
diff --git a/ansible/roles/tacker/templates/tacker-conductor.json.j2 b/ansible/roles/tacker/templates/tacker-conductor.json.j2
new file mode 100644
index 0000000000000000000000000000000000000000..080a90a018ced2852eae2ead2576753898b7148c
--- /dev/null
+++ b/ansible/roles/tacker/templates/tacker-conductor.json.j2
@@ -0,0 +1,25 @@
+{
+    "command": "tacker-conductor --config-file /etc/tacker/tacker.conf",
+    "config_files":[
+        {
+            "source": "{{ container_config_directory }}/tacker.conf",
+            "dest": "/etc/tacker/tacker.conf",
+            "owner": "tacker",
+            "perm": "0600"
+        },
+        {
+            "source": "{{ container_config_directory }}/policy.json",
+            "dest": "/etc/tacker/policy.json",
+            "owner": "tacker",
+            "perm": "0600",
+            "optional": true
+        }
+    ],
+    "permissions": [
+        {
+            "path": "/var/log/kolla/tacker",
+            "owner": "tacker:tacker",
+            "recurse": true
+        }
+    ]
+}
diff --git a/ansible/roles/tacker/templates/tacker.json.j2 b/ansible/roles/tacker/templates/tacker-server.json.j2
similarity index 100%
rename from ansible/roles/tacker/templates/tacker.json.j2
rename to ansible/roles/tacker/templates/tacker-server.json.j2
diff --git a/ansible/roles/tacker/templates/tacker.conf.j2 b/ansible/roles/tacker/templates/tacker.conf.j2
index 1dde691233a0b0b24e5e97290b41374a19634c37..130294e0397f6759add671959a0b7bae53d0649e 100644
--- a/ansible/roles/tacker/templates/tacker.conf.j2
+++ b/ansible/roles/tacker/templates/tacker.conf.j2
@@ -1,6 +1,5 @@
 [DEFAULT]
 debug = {{ tacker_logging_debug }}
-
 log_dir = /var/log/kolla/tacker
 
 transport_url = rabbit://{% for host in groups['rabbitmq'] %}{{ rabbitmq_user }}:{{ rabbitmq_password }}@{{ hostvars[host]['ansible_' + hostvars[host]['api_interface']]['ipv4']['address'] }}:{{ rabbitmq_port }}{% if not loop.last %},{% endif %}{% endfor %}
@@ -8,6 +7,7 @@ transport_url = rabbit://{% for host in groups['rabbitmq'] %}{{ rabbitmq_user }}
 bind_host = {{ api_interface_address }}
 bind_port = {{ tacker_server_port }}
 api_workers = {{ openstack_service_workers }}
+service_plugins = nfvo,vnfm
 
 {% if enable_nova | bool %}
 nova_url = {{ internal_protocol }}://{{ kolla_internal_fqdn }}:{{ nova_api_port }}
@@ -16,22 +16,29 @@ nova_admin_password = {{ nova_keystone_password }}
 nova_admin_tenant_id = service
 nova_admin_auth_url = {{ admin_protocol }}://{{ kolla_internal_fqdn }}:{{ keystone_admin_port }}
 
-[tacker]
-monitor_driver = ping,http_ping
-{% if enable_ceilometer | bool %}
-alarm_monitor_driver = ceilometer
-{% endif %}
-
 [tacker_nova]
 auth_uri = {{ internal_protocol }}://{{ kolla_internal_fqdn }}:{{ keystone_public_port }}
 auth_url = {{ admin_protocol }}://{{ kolla_internal_fqdn }}:{{ keystone_admin_port }}
 auth_type = password
-project_domain_id = {{ default_project_domain_id }}
-user_domain_id = {{ default_user_domain_id }}
+project_domain_name = {{ default_project_domain_id }}
+user_domain_name = {{ default_user_domain_id }}
 project_name = service
 username = {{ nova_keystone_user }}
 password = {{ nova_keystone_password }}
-auth_url = {{ admin_protocol }}://{{ kolla_internal_fqdn }}:{{ keystone_admin_port }}
+{% endif %}
+
+[nfvo]
+vim_drivers = openstack
+
+{% if enable_barbican | bool %}
+[vim_keys]
+use_barbican = True
+{% endif %}
+
+[tacker]
+monitor_driver = ping,http_ping
+{% if enable_ceilometer | bool %}
+alarm_monitor_driver = ceilometer
 {% endif %}
 
 [database]
@@ -42,8 +49,8 @@ max_retries = -1
 auth_uri = {{ internal_protocol }}://{{ kolla_internal_fqdn }}:{{ keystone_public_port }}
 auth_url = {{ admin_protocol }}://{{ kolla_internal_fqdn }}:{{ keystone_admin_port }}
 auth_type = password
-project_domain_id = {{ default_project_domain_id }}
-user_domain_id = {{ default_user_domain_id }}
+project_domain_name = {{ default_project_domain_id }}
+user_domain_name = {{ default_user_domain_id }}
 project_name = service
 username = {{ tacker_keystone_user }}
 password = {{ tacker_keystone_password }}
diff --git a/ansible/site.yml b/ansible/site.yml
index 05435f59266fcd1b6d741070f42c28ed52a966a1..da683b1d0d1f76e7cf4803da52533f3db21d2f5b 100644
--- a/ansible/site.yml
+++ b/ansible/site.yml
@@ -663,7 +663,9 @@
 
 - name: Apply role tacker
   gather_facts: false
-  hosts: tacker
+  hosts:
+    - tacker-server
+    - tacker-conductor
   serial: '{{ serial|default("0") }}'
   roles:
     - { role: tacker,
diff --git a/releasenotes/notes/tacker-conductor-dc90739426381e14.yaml b/releasenotes/notes/tacker-conductor-dc90739426381e14.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2927088481f35ff243d17b225b72ea563d1f2a13
--- /dev/null
+++ b/releasenotes/notes/tacker-conductor-dc90739426381e14.yaml
@@ -0,0 +1,11 @@
+---
+features:
+  - |
+    New Tacker conductor service is implemented.
+upgrade:
+  - |
+    To support new tacker-conductor service, tacker role has been
+    reformated, before upgrade, tacker-server and tacker-conductor
+    groups should be included in inventory files.
+  - Tacker requires Mistral service to be enabled as of Pike release
+    to implement vim monitoring.