diff --git a/README.md b/README.md
index cb01cbea4..cf7c2ae9b 100644
--- a/README.md
+++ b/README.md
@@ -33,7 +33,7 @@ scenario](#All-In-One).
 
 |     -      | scenario001 | scenario002 | scenario003 | scenario-aio |
 |:----------:|:-----------:|:-----------:|:-----------:|:-------------:
-| ssl        |     yes     |      yes    |      no     |      no      |
+| ssl        |     yes     |      yes    |      yes    |      no      |
 | ipv6       |   centos7   |    centos7  |      no     |      no      |
 | keystone   |      X      |       X     |       X     |       X      |
 | glance     |     rbd     |     swift   |     file    |     file     |
diff --git a/fixtures/scenario003.pp b/fixtures/scenario003.pp
index 35c2aa26a..8f381ea41 100644
--- a/fixtures/scenario003.pp
+++ b/fixtures/scenario003.pp
@@ -29,6 +29,10 @@ case $::osfamily {
 }
 
 include ::openstack_integration
+class { '::openstack_integration::config':
+  ssl => true,
+}
+include ::openstack_integration::cacert
 include ::openstack_integration::rabbitmq
 include ::openstack_integration::mysql
 include ::openstack_integration::keystone
diff --git a/manifests/heat.pp b/manifests/heat.pp
index 7b3004db9..b3602f9bd 100644
--- a/manifests/heat.pp
+++ b/manifests/heat.pp
@@ -1,5 +1,8 @@
 class openstack_integration::heat {
 
+  include ::openstack_integration::config
+  include ::openstack_integration::params
+
   rabbitmq_user { 'heat':
     admin    => true,
     password => 'an_even_bigger_secret',
@@ -14,12 +17,28 @@ class openstack_integration::heat {
     require              => Class['::rabbitmq'],
   }
 
+  if $::openstack_integration::config::ssl {
+    openstack_integration::ssl_key { 'heat':
+      require => Package['heat-common'],
+    }
+    $key_file = "/etc/heat/ssl/private/${::fqdn}.pem"
+    $crt_file = $::openstack_integration::params::cert_path
+    File[$key_file] ~> Service<| tag == 'heat-service' |>
+    Exec['update-ca-certificates'] ~> Service<| tag == 'heat-service' |>
+  } else {
+    $key_file = undef
+    $crt_file = undef
+  }
+
   class { '::heat':
     rabbit_userid       => 'heat',
     rabbit_password     => 'an_even_bigger_secret',
-    rabbit_host         => '127.0.0.1',
+    rabbit_host         => $::openstack_integration::config::ip_for_url,
+    rabbit_use_ssl      => $::openstack_integration::config::ssl,
+    rabbit_port         => $::openstack_integration::config::rabbit_port,
     database_connection => 'mysql+pymysql://heat:heat@127.0.0.1/heat?charset=utf8',
-    identity_uri        => 'http://127.0.0.1:35357/',
+    identity_uri        => $::openstack_integration::config::keystone_auth_uri,
+    auth_uri            => $::openstack_integration::config::keystone_admin_uri,
     keystone_password   => 'a_big_secret',
     debug               => true,
     verbose             => true,
@@ -30,6 +49,9 @@ class openstack_integration::heat {
   class { '::heat::keystone::auth':
     password                  => 'a_big_secret',
     configure_delegated_roles => true,
+    public_url                => "${::openstack_integration::config::base_url}:8004/v1/%(tenant_id)s",
+    internal_url              => "${::openstack_integration::config::base_url}:8004/v1/%(tenant_id)s",
+    admin_url                 => "${::openstack_integration::config::base_url}:8004/v1/%(tenant_id)s",
   }
   class { '::heat::keystone::domain':
     domain_password => 'oh_my_no_secret',
@@ -37,16 +59,28 @@ class openstack_integration::heat {
   Keystone_user_role['heat_admin::heat@::heat'] -> File['/root/openrc']
   class { '::heat::client': }
   class { '::heat::api':
-    workers => '2',
+    workers   => '2',
+    use_ssl   => $::openstack_integration::config::ssl,
+    cert_file => $crt_file,
+    key_file  => $key_file,
   }
   class { '::heat::engine':
-    auth_encryption_key => '1234567890AZERTYUIOPMLKJHGFDSQ12',
+    auth_encryption_key           => '1234567890AZERTYUIOPMLKJHGFDSQ12',
+    heat_metadata_server_url      => "${::openstack_integration::config::base_url}:8000",
+    heat_waitcondition_server_url => "${::openstack_integration::config::base_url}:8000/v1/waitcondition",
+    heat_watch_server_url         => "${::openstack_integration::config::base_url}:8003",
   }
   class { '::heat::api_cloudwatch':
-    workers => '2',
+    workers   => '2',
+    use_ssl   => $::openstack_integration::config::ssl,
+    cert_file => $crt_file,
+    key_file  => $key_file,
   }
   class { '::heat::api_cfn':
-    workers => '2',
+    workers   => '2',
+    use_ssl   => $::openstack_integration::config::ssl,
+    cert_file => $crt_file,
+    key_file  => $key_file,
   }
 
 }
diff --git a/manifests/horizon.pp b/manifests/horizon.pp
index 69ce30e71..dcde51045 100644
--- a/manifests/horizon.pp
+++ b/manifests/horizon.pp
@@ -1,14 +1,46 @@
 class openstack_integration::horizon {
 
-  $vhost_params = { add_listen => false }
+  include ::openstack_integration::config
+  include ::openstack_integration::params
+
+  if $::openstack_integration::config::ssl {
+    file { '/etc/openstack-dashboard/ssl':
+      ensure                  => directory,
+      owner                   => 'root',
+      mode                    => '0755',
+      selinux_ignore_defaults => true,
+      require                 => Package['horizon'],
+    }
+    file { '/etc/openstack-dashboard/ssl/private':
+      ensure                  => directory,
+      owner                   => 'root',
+      mode                    => '0755',
+      selinux_ignore_defaults => true,
+      require                 => File['/etc/openstack-dashboard/ssl'],
+      before                  => File["/etc/openstack-dashboard/ssl/private/${::fqdn}.pem"],
+    }
+    openstack_integration::ssl_key { 'horizon':
+      key_path  => "/etc/openstack-dashboard/ssl/private/${::fqdn}.pem",
+      key_owner => 'root',
+      require   => File['/etc/openstack-dashboard/ssl/private'],
+      notify    => Service['httpd'],
+    }
+    Exec['update-ca-certificates'] ~> Service['httpd']
+  }
+
   class { '::horizon':
-    secret_key         => 'big_secret',
-    vhost_extra_params => $vhost_params,
-    servername         => $::hostname,
-    allowed_hosts      => $::hostname,
+    secret_key       => 'big_secret',
+    servername       => $::openstack_integration::config::ip_for_url,
+    allowed_hosts    => $::openstack_integration::config::ip_for_url,
+    listen_ssl       => $::openstack_integration::config::ssl,
+    ssl_redirect     => $::openstack_integration::config::ssl,
+    horizon_cert     => $::openstack_integration::params::cert_path,
+    horizon_key      => "/etc/openstack-dashboard/ssl/private/${::fqdn}.pem",
+    horizon_ca       => $::openstack_integration::params::ca_bundle_cert_path,
+    keystone_url     => "${::openstack_integration::config::keystone_auth_uri}/v3",
     # need to disable offline compression due to
     # https://bugs.launchpad.net/ubuntu/+source/horizon/+bug/1424042
-    compress_offline   => false,
+    compress_offline => false,
   }
 
 }
diff --git a/manifests/sahara.pp b/manifests/sahara.pp
index 16920e6eb..1079a0cab 100644
--- a/manifests/sahara.pp
+++ b/manifests/sahara.pp
@@ -1,5 +1,8 @@
 class openstack_integration::sahara {
 
+  include ::openstack_integration::config
+  include ::openstack_integration::params
+
   rabbitmq_user { 'sahara':
     admin    => true,
     password => 'an_even_bigger_secret',
@@ -18,19 +21,28 @@ class openstack_integration::sahara {
     password => 'sahara',
   }
   class { '::sahara::keystone::auth':
+    # SSL does not seem to work in Sahara
+    # https://bugs.launchpad.net/sahara/+bug/1565082
+    public_url   => "http://${::openstack_integration::config::ip_for_url}:8386/v1.1/%(tenant_id)s",
+    internal_url => "http://${::openstack_integration::config::ip_for_url}:8386/v1.1/%(tenant_id)s",
+    admin_url    => "http://${::openstack_integration::config::ip_for_url}:8386/v1.1/%(tenant_id)s",
     password     => 'a_big_secret',
   }
   class { '::sahara':
     database_connection => 'mysql+pymysql://sahara:sahara@127.0.0.1/sahara?charset=utf8',
     rabbit_userid       => 'sahara',
     rabbit_password     => 'an_even_bigger_secret',
-    rabbit_host         => '127.0.0.1',
+    rabbit_host         => $::openstack_integration::config::ip_for_url,
+    rabbit_port         => $::openstack_integration::config::rabbit_port,
+    rabbit_use_ssl      => $::openstack_integration::config::ssl,
     rpc_backend         => 'rabbit',
     admin_password      => 'a_big_secret',
     admin_user          => 'sahara',
     admin_tenant_name   => 'services',
     debug               => true,
     verbose             => true,
+    auth_uri            => "${::openstack_integration::config::keystone_admin_uri}/v2.0",
+    identity_uri        => $::openstack_integration::config::keystone_admin_uri,
   }
   class { '::sahara::service::api':
     api_workers => 2,
diff --git a/manifests/ssl_key.pp b/manifests/ssl_key.pp
index a5abb86e6..c54e55161 100644
--- a/manifests/ssl_key.pp
+++ b/manifests/ssl_key.pp
@@ -4,8 +4,13 @@
 #   (optional) Path of SSL private key
 #   Defaults to undef.
 #
+# [*key_owner*]
+#   (optional) Owner of SSL private key
+#   Defaults to $name.
+#
 define openstack_integration::ssl_key(
-  $key_path = undef,
+  $key_path  = undef,
+  $key_owner = $name,
 ) {
 
   include ::openstack_integration::config
@@ -37,7 +42,7 @@ define openstack_integration::ssl_key(
 
   file { $_key_path:
     ensure                  => present,
-    owner                   => $name,
+    owner                   => $key_owner,
     source                  => "puppet:///modules/openstack_integration/ipv${openstack_integration::config::ip_version}.key",
     selinux_ignore_defaults => true,
     mode                    => '0600',
diff --git a/manifests/tempest.pp b/manifests/tempest.pp
index 7c3fd0ac7..7c8affb2e 100644
--- a/manifests/tempest.pp
+++ b/manifests/tempest.pp
@@ -99,7 +99,7 @@ class openstack_integration::tempest (
     swift_available        => $swift,
     ironic_available       => $ironic,
     public_network_name    => 'public',
-    dashboard_url          => "http://${::hostname}/",
+    dashboard_url          => $::openstack_integration::config::base_url,
     flavor_ref             => '42',
     flavor_ref_alt         => '84',
     image_ssh_user         => 'cirros',
diff --git a/manifests/trove.pp b/manifests/trove.pp
index 2242afcd4..4fe2f9f0b 100644
--- a/manifests/trove.pp
+++ b/manifests/trove.pp
@@ -1,5 +1,8 @@
 class openstack_integration::trove {
 
+  include ::openstack_integration::config
+  include ::openstack_integration::params
+
   rabbitmq_user { 'trove':
     admin    => true,
     password => 'an_even_bigger_secret',
@@ -14,38 +17,58 @@ class openstack_integration::trove {
     require              => Class['::rabbitmq'],
   }
 
+  if $::openstack_integration::config::ssl {
+    openstack_integration::ssl_key { 'trove':
+      require => Package['trove'],
+    }
+    $key_file = "/etc/trove/ssl/private/${::fqdn}.pem"
+    $crt_file = $::openstack_integration::params::cert_path
+    File[$key_file] ~> Service<| tag == 'trove-service' |>
+    Exec['update-ca-certificates'] ~> Service<| tag == 'trove-service' |>
+  } else {
+    $key_file = undef
+    $crt_file = undef
+  }
+
   class { '::trove':
     database_connection   => 'mysql+pymysql://trove:trove@127.0.0.1/trove?charset=utf8',
     rabbit_userid         => 'trove',
     rabbit_password       => 'an_even_bigger_secret',
-    rabbit_host           => '127.0.0.1',
+    rabbit_host           => $::openstack_integration::config::ip_for_url,
+    rabbit_port           => $::openstack_integration::config::rabbit_port,
+    rabbit_use_ssl        => $::openstack_integration::config::ssl,
     nova_proxy_admin_pass => 'a_big_secret',
   }
   class { '::trove::db::mysql':
     password => 'trove',
   }
   class { '::trove::keystone::auth':
-    password => 'a_big_secret',
+    password     => 'a_big_secret',
+    public_url   => "${::openstack_integration::config::base_url}:8779/v1.0/%(tenant_id)s",
+    internal_url => "${::openstack_integration::config::base_url}:8779/v1.0/%(tenant_id)s",
+    admin_url    => "${::openstack_integration::config::base_url}:8779/v1.0/%(tenant_id)s",
   }
   class { '::trove::api':
     keystone_password => 'a_big_secret',
-    auth_uri          => 'http://127.0.0.1:5000/',
-    identity_uri      => 'http://127.0.0.1:35357/',
+    auth_uri          => $::openstack_integration::config::keystone_auth_uri,
+    identity_uri      => $::openstack_integration::config::keystone_admin_uri,
     debug             => true,
     verbose           => true,
     workers           => 2,
+    cert_file         => $crt_file,
+    key_file          => $key_file,
   }
   class { '::trove::client': }
   class { '::trove::conductor':
     debug    => true,
     verbose  => true,
     workers  => 2,
-    auth_url => 'http://127.0.0.1:5000/',
+    auth_url => $::openstack_integration::config::keystone_auth_uri,
   }
   class { '::trove::taskmanager':
     debug    => true,
     verbose  => true,
-    auth_url => 'http://127.0.0.1:5000/',
+    auth_url => $::openstack_integration::config::keystone_auth_uri,
   }
 
 }