diff --git a/templates/listen.erb b/templates/listen.erb
index a418737fde4975bdd194fe7642bfcca259329a3c..8bc9b930f479870bca233a39e3718eb9aa06dff8 100644
--- a/templates/listen.erb
+++ b/templates/listen.erb
@@ -1,22 +1,25 @@
 <%
     listen_on = []
-    [@urls].flatten.sort.uniq.each { |u|
+    [@urls].flatten.sort.uniq.each do |u|
 	u =~ /^([a-z]*):\/\/([^:\/]+|\[[^\[\]]+\])(:([0-9]+))?\/?$/
 	(schema,host,port) = $1,$2,$4
 	if host == ''
 	    host = @name
 	end
 	if host == '*'
-	    addr = host
-	elsif host =~ /^\[[0-9a-f:]*:[0-9a-f:]*\]$/
-	    addr = host    # IPv6 numeric address "[0000:1111::eeee:ffff]"
+	    addrs = host
+	elsif host =~ /^\[[0-9A-Fa-f:]*:[0-9A-Fa-f:]*:[0-9A-Fa-f:]*\]$/
+	    # IPv6 numeric address "[0000:1111::eeee:ffff]"
+	    # Note: keep brackets, as those are needed below
+	    addrs = host
 	elsif host =~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/
-	    addr = host    # IPv4 numeric address "111.222.333.444"
+	    # IPv4 numeric address "111.222.333.444"
+	    addrs = host
 	elsif host =~ /^\[(.+)\]$/
 	    # Hostname within brackets "[www.example.com]", not to be resolved
-	    host = addr = $1
+	    addrs = host = $1
 	else
-	    addr = scope.function_resolve_ipnets([host, 'failerrors'])
+	    addrs = scope.function_resolve_ipnets([host, 'failerrors'])
 	end
 	if port == nil
 	    if schema == 'http'
@@ -29,8 +32,14 @@
 		raise(Puppet::Error, "Unknown URL schema and no port: #{u}")
 	    end
 	end
-	listen_on << addr + ':' + port + ' ' + schema
-    }
+	[addrs].flatten.each do |a|
+	    if a =~ /^[0-9A-Fa-f:]*:[0-9A-Fa-f:]*:[0-9A-Fa-f:]*$/
+		# IPv6 addresses need to be enclosed within square brackets
+		a = '[' + a + ']'
+	    end
+	    listen_on << a + ':' + port + ' ' + schema
+	end
+    end
     listen_on.sort!.uniq!
 -%>
 <% listen_on.each do |listen_spec| -%>
diff --git a/templates/named_vhost.conf.erb b/templates/named_vhost.conf.erb
index add9d1283ffd8ce4907e15715068a5d2e4027f19..bf297900bc6cd84cd60c237c3ef87e7f5bde565a 100644
--- a/templates/named_vhost.conf.erb
+++ b/templates/named_vhost.conf.erb
@@ -1,23 +1,26 @@
 <%
     server_names = []
     server_addrs = []
-    [@urls].flatten.sort.each { |u|
+    [@urls].flatten.sort.each do |u|
 	u =~ /^([a-z]*):\/\/([^:\/]+|\[[^\[\]]+\])(:([0-9]+))?\/?$/
 	(schema,host,port) = $1,$2,$4
 	if host == ''
 	    host = @name
 	end
 	if host == '*'
-	    addr = host
-	elsif host =~ /^\[[0-9a-f:]*:[0-9a-f:]*\]$/
-	    addr = host    # IPv6 numeric address "[0000:1111::eeee:ffff]"
+	    addrs = host
+	elsif host =~ /^\[[0-9A-Fa-f:]*:[0-9A-Fa-f:]*:[0-9A-Fa-f:]*\]$/
+	    # IPv6 numeric address "[0000:1111::eeee:ffff]"
+	    # Note: keep brackets, as those are needed below
+	    addrs = host
 	elsif host =~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/
-	    addr = host    # IPv4 numeric address "111.222.333.444"
+	    # IPv4 numeric address "111.222.333.444"
+	    addrs = host
 	elsif host =~ /^\[(.+)\]$/
 	    # Hostname within brackets "[www.example.com]", not to be resolved
-	    host = addr = $1
+	    addrs = host = $1
 	else
-	    addr = scope.function_resolve_ipnets([host, 'failerrors'])
+	    addrs = scope.function_resolve_ipnets([host, 'failerrors'])
 	end
 	if port == nil
 	    if schema == 'http'
@@ -31,8 +34,14 @@
 	    end
 	end
 	server_names << host + ':' + port
-	server_addrs << addr + ':' + port
-    }
+	[addrs].flatten.each do |a|
+	    if a =~ /^[0-9A-Fa-f:]*:[0-9A-Fa-f:]*:[0-9A-Fa-f:]*$/
+		# IPv6 addresses need to be enclosed within square brackets
+		a = '[' + a + ']'
+	    end
+	    server_addrs << a + ':' + port
+	end
+    end
     if @servernames != []
 	server_names = @servernames
     end