diff --git a/generators/input-validators/schema-site.yaml b/generators/input-validators/schema-site.yaml
index 3c58fd8e575080e286063672100265174c6391de..789dcd07c4ebed05f93aba661d10ac985f9bd42a 100644
--- a/generators/input-validators/schema-site.yaml
+++ b/generators/input-validators/schema-site.yaml
@@ -1,6 +1,6 @@
 ---
-clusters: required_hash
-networks: required_hash
+clusters: optional_hash
+networks: optional_hash
 servers:
   <optional_hash>:
     <multi>:
diff --git a/generators/puppet/bindg5k.rb b/generators/puppet/bindg5k.rb
index 5aa027f05bb1c9d3b36e08d2da301afb14c05b6e..de8172161b8a2a04f22751bc732c30e0eb0a3c98 100644
--- a/generators/puppet/bindg5k.rb
+++ b/generators/puppet/bindg5k.rb
@@ -21,7 +21,7 @@ input_data_dir = "../../input/grid5000/"
 refapi = load_yaml_file_hierarchy(File.expand_path(input_data_dir, File.dirname(__FILE__)))
 
 $options = {}
-$options[:sites] = %w{grenoble lille luxembourg lyon nancy nantes rennes sophia}
+$options[:sites] = %w{grenoble lille luxembourg lyon nancy nantes rennes sophia toulouse}
 $options[:output_dir] = "/tmp/puppet"
 $options[:verbose] = false
 
@@ -388,7 +388,7 @@ def set_zone_header_records(zone, site)
   zone.mx = DNS::Zone::RR::MX.new
   zone.mx.priority = 10
   zone.mx.exchange = "mail.#{zone.site_uid}.grid5000.fr."
-  if (File.basename(zone.file_path) == "#{zone.site_uid}.db")
+  if (File.basename(zone.file_path) == "#{zone.site_uid}.db" && site['frontend_ip'])
     zone.at = DNS::Zone::RR::A.new
     zone.at.address = site['frontend_ip']
   end
@@ -494,7 +494,7 @@ refapi["sites"].each { |site_uid, site|
   site_records['networks'] = get_networks_records(site, 'networks') unless site['networks'].nil?
   site_records['laptops'] = get_networks_records(site, 'laptops') unless site['laptops'].nil?
 
-  site.fetch("clusters").sort.each { |cluster_uid, cluster|
+  site.fetch("clusters", []).sort.each { |cluster_uid, cluster|
 
     cluster.fetch('nodes').select { |node_uid, node|
       node != nil && node["status"] != "retired" && node.has_key?('network_adapters')
diff --git a/generators/puppet/templates/kavlan-dhcp.conf.erb b/generators/puppet/templates/kavlan-dhcp.conf.erb
index 927c48c97406c68ad1bd26c41e91f73fffcda76c..ca8fddf9de3251db84a5fab9079fdb99c14a5a18 100644
--- a/generators/puppet/templates/kavlan-dhcp.conf.erb
+++ b/generators/puppet/templates/kavlan-dhcp.conf.erb
@@ -30,7 +30,7 @@ subnet <%= kavlan_ip.network.to_addr %> netmask <%= kavlan_ip.netmask.to_addr %>
 <%
 refapi['sites'].sort.to_h.each_key do |site|
   next if kavlan_id.to_i.between?(1, 9) and site != site_uid
-  refapi['sites'][site]['clusters'].sort.to_h.each do |cluster_uid, cluster|
+  refapi['sites'][site].fetch('clusters', []).sort.to_h.each do |cluster_uid, cluster|
     cluster['nodes'].sort.to_h.each do |node_uid, node|
       next if node['status'] and node['status'] == 'retired'
       node['network_adapters'].each do |interface_uid, interface|
diff --git a/generators/reference-api/reference-api.rb b/generators/reference-api/reference-api.rb
index f6c9fe864184e145585bab5e9dbef07120e34240..291e81a00dd21a0fab720bc839610793b653a610 100644
--- a/generators/reference-api/reference-api.rb
+++ b/generators/reference-api/reference-api.rb
@@ -185,11 +185,11 @@ global_hash["sites"].each do |site_uid, site|
   # Write network info
   #
 
-  site["networks"].sort.each do |network_uid, network|
+  site.fetch("networks", []).sort.each do |network_uid, network|
     create_network_equipment(network_uid, network, refapi_path, site_uid)
   end
 
-  site["clusters"].sort.each do |cluster_uid, cluster|
+  site.fetch("clusters", []).sort.each do |cluster_uid, cluster|
     puts "  #{cluster_uid}"
 
     #