diff --git a/generators/wiki/cpu_parameters.rb b/generators/wiki/cpu_parameters.rb
index 441cad5cf875f6fc30dbb923506899934cf0513a..16997679c298b61a167c1eca6b808034f65d5308 100644
--- a/generators/wiki/cpu_parameters.rb
+++ b/generators/wiki/cpu_parameters.rb
@@ -15,8 +15,8 @@ class CPUParametersGenerator < WikiGenerator
     global_hash = load_yaml_file_hierarchy(File.expand_path("../../input/grid5000/", File.dirname(__FILE__)))
 
     # Loop over Grid'5000 sites
-    global_hash["sites"].each { |site_uid, site_hash|
-      site_hash.fetch("clusters").each { |cluster_uid, cluster_hash|
+    global_hash["sites"].sort.to_h.each { |site_uid, site_hash|
+      site_hash.fetch("clusters").sort.to_h.each { |cluster_uid, cluster_hash|
 
         node_hash = cluster_hash.fetch('nodes').first[1]
 
diff --git a/generators/wiki/disk_reservation.rb b/generators/wiki/disk_reservation.rb
index bd24177e985b1d0ea8f582f13b0e1e96e1db7325..65137b1a91cde563041e3d0cef9d03475e821d93 100644
--- a/generators/wiki/disk_reservation.rb
+++ b/generators/wiki/disk_reservation.rb
@@ -15,17 +15,17 @@ class DiskReservationGenerator < WikiGenerator
     global_hash = load_yaml_file_hierarchy(File.expand_path("../../input/grid5000/", File.dirname(__FILE__)))
 
     # Loop over Grid'5000 sites
-    global_hash["sites"].each { |site_uid, site_hash|
-      site_hash.fetch("clusters").each { |cluster_uid, cluster_hash|
+    global_hash["sites"].sort.to_h.each { |site_uid, site_hash|
+      site_hash.fetch("clusters").sort.to_h.each { |cluster_uid, cluster_hash|
         disk_info = {}
-        cluster_hash.fetch('nodes').sort.each { |node_uid, node_hash|
+        cluster_hash.fetch('nodes').sort.to_h.each { |node_uid, node_hash|
           next if node_hash['status'] == 'retired'
            reservable_disks = node_hash['storage_devices'].select{ |k, v| v['reservation'] == true }.count
           add(disk_info, node_uid, reservable_disks)
         }
 
         # One line for each group of nodes with the same number of reservable disks
-        disk_info.each { |num, reservable_disks|
+        disk_info.sort.to_h.each { |num, reservable_disks|
         table_data << [
           "[[#{site_uid.capitalize}:Hardware|#{site_uid.capitalize}]]",
           "[https://public-api.grid5000.fr/stable/sites/#{site_uid}/clusters/#{cluster_uid}/nodes.json?pretty=1 #{cluster_uid}" + (disk_info.size== 1 ? '' : '-' + G5K.nodeset(num)) + "]",
diff --git a/generators/wiki/hardware.rb b/generators/wiki/hardware.rb
index 0faeee7c6a585d984d2eeceff42e4f422f670afe..121ca0ec323b5354e91b0289bc92d4431fbb63f8 100644
--- a/generators/wiki/hardware.rb
+++ b/generators/wiki/hardware.rb
@@ -36,9 +36,9 @@ class G5KHardwareGenerator < WikiGenerator
       'node_models' => {}
     }
     
-    @global_hash['sites'].sort.each { |site_uid, site_hash|
-      site_hash['clusters'].sort.each { |cluster_uid, cluster_hash|
-        cluster_hash['nodes'].sort.each { |node_uid, node_hash|
+    @global_hash['sites'].sort.to_h.each { |site_uid, site_hash|
+      site_hash['clusters'].sort.to_h.each { |cluster_uid, cluster_hash|
+        cluster_hash['nodes'].sort.to_h.each { |node_uid, node_hash|
           next if node_hash['status'] == 'retired'
           @node = node_uid
           
@@ -74,7 +74,7 @@ class G5KHardwareGenerator < WikiGenerator
                        .uniq
 
           net_interconnects = interfaces.inject(Hash.new(0)){ |h, v| h[v] += 1; h }
-          net_interconnects.each { |k, v|
+          net_interconnects.sort_by { |k, v|  k.first[:sort] }.each { |k, v|
             init(data, 'net_interconnects', k)
             data['net_interconnects'][k][site_uid] += v
           }
@@ -87,7 +87,7 @@ class G5KHardwareGenerator < WikiGenerator
           gpu_families[[g['gpu_vendor']]] = g['gpu_count'] if g and g['gpu']
           mic_families = {}
           mic_families[[m['mic_vendor']]] = m['mic_count'] if m and m['mic']
-          gpu_families.merge(mic_families).each { |k, v|
+          gpu_families.merge(mic_families).sort.to_h.each { |k, v|
             init(data, 'acc_families', k) 
             data['acc_families'][k][site_uid] += v
           }
@@ -97,7 +97,7 @@ class G5KHardwareGenerator < WikiGenerator
           mic_details = {}
           mic_details[["#{m['mic_vendor']} #{m['mic_model']}"]] = [m['mic_count'], m['mic_cores']] if m and m['mic']
           
-          gpu_details.merge(mic_details).each { |k, v|
+          gpu_details.merge(mic_details).sort.to_h.each { |k, v|
             init(data, 'acc_models', k)
             data['acc_models'][k][site_uid] += v[0]
 
@@ -211,10 +211,10 @@ class G5KHardwareGenerator < WikiGenerator
   
   def generate_interfaces
     table_data = []
-    @global_hash["sites"].each { |site_uid, site_hash|
-      site_hash.fetch("clusters").each { |cluster_uid, cluster_hash|
+    @global_hash["sites"].sort.to_h.each { |site_uid, site_hash|
+      site_hash.fetch("clusters").sort.to_h.each { |cluster_uid, cluster_hash|
         network_interfaces = {}
-        cluster_hash.fetch('nodes').sort.each { |node_uid, node_hash|
+        cluster_hash.fetch('nodes').sort.to_h.each { |node_uid, node_hash|
           next if node_hash['status'] == 'retired'
           if node_hash['network_adapters']
             node_interfaces = node_hash['network_adapters'].select{ |k, v| v['interface'] == 'Ethernet' and v['enabled'] == true and (v['mounted'] == true or v['mountable'] == true) and v['management'] == false }
diff --git a/generators/wiki/oar_properties.rb b/generators/wiki/oar_properties.rb
index 6b8ed78caa8847a7ccc898cb17a824788d3bb40e..df4d59d67b6f79b7f599e8e58d7568374d283fbe 100644
--- a/generators/wiki/oar_properties.rb
+++ b/generators/wiki/oar_properties.rb
@@ -145,8 +145,8 @@ class OarPropertiesGenerator < WikiGenerator
 
   def get_nodes_properties(site_uid, site)
     properties = {}
-    site['clusters'].each do |cluster_uid, cluster|
-      cluster['nodes'].each do |node_uid, node|
+    site['clusters'].sort.to_h.each do |cluster_uid, cluster|
+      cluster['nodes'].sort.to_h.each do |node_uid, node|
         begin
           properties[node_uid] = get_ref_node_properties_internal(cluster_uid, cluster, node_uid, node)
         rescue MissingProperty => e
@@ -182,9 +182,9 @@ class OarPropertiesGenerator < WikiGenerator
 
     #Compiled properties used to generate page
     oar_properties = {}
-    props.each { |site, site_props|
-      site_props.each { |node_uid, node_props|
-        node_props.each { |property, value|
+    props.sort.to_h.each { |site, site_props|
+      site_props.sort.to_h.each { |node_uid, node_props|
+        node_props.sort.to_h.each { |property, value|
           next if @@ignored_properties.include?(property)
 
           oar_properties[property] ||= {}
@@ -198,7 +198,7 @@ class OarPropertiesGenerator < WikiGenerator
       }
     }
 
-    oar_properties.each { |prop, prop_hash|
+    oar_properties.sort.to_h.each { |prop, prop_hash|
       if (prop_hash["values"].length > 20)
         #Limit possible values to 20 elements and mark the list as truncated
         prop_hash["values"].slice!(0...-20)
@@ -210,7 +210,7 @@ class OarPropertiesGenerator < WikiGenerator
     @generated_content = "Properties on resources managed by OAR allow users to select them according to their experiment's characteristics." + MW::LINE_FEED
     @generated_content += MW::heading("OAR Properties", 1) + MW::LINE_FEED
 
-    @@categories.each { |cat, cat_properties|
+    @@categories.sort.to_h.each { |cat, cat_properties|
       @generated_content += MW::heading(cat, 2) + MW::LINE_FEED
       cat_properties.each{ |property|
         values = oar_properties[property]["values"] rescue []