diff --git a/data/grid5000/sites/lyon/network_equipments/salome.json b/data/grid5000/sites/lyon/network_equipments/salome.json
index 08c2e5dc47edf6e9bd29514a38a1b13c6571c286..e16786b8d89ca5f823e499face7b854793a09565 100644
--- a/data/grid5000/sites/lyon/network_equipments/salome.json
+++ b/data/grid5000/sites/lyon/network_equipments/salome.json
@@ -17,6 +17,7 @@
           "kind": "router",
           "port": "0:24",
           "snmp_name": "GigabitEthernet1",
+          "ssh_name": "1",
           "uid": "gw"
         },
         {
@@ -63,24 +64,28 @@
           "kind": "node",
           "port": "eth1",
           "snmp_name": "GigabitEthernet22",
+          "ssh_name": "22",
           "uid": "sagittaire-2"
         },
         {
           "kind": "node",
           "port": "eth1",
           "snmp_name": "GigabitEthernet23",
+          "ssh_name": "23",
           "uid": "sagittaire-3"
         },
         {
           "kind": "node",
           "port": "eth1",
           "snmp_name": "GigabitEthernet24",
+          "ssh_name": "24",
           "uid": "sagittaire-4"
         },
         {
           "kind": "node",
           "port": "eth1",
           "snmp_name": "GigabitEthernet25",
+          "ssh_name": "25",
           "uid": "sagittaire-5"
         },
         {
@@ -91,36 +96,42 @@
           "kind": "node",
           "port": "eth1",
           "snmp_name": "GigabitEthernet28",
+          "ssh_name": "28",
           "uid": "sagittaire-11"
         },
         {
           "kind": "node",
           "port": "eth1",
           "snmp_name": "GigabitEthernet29",
+          "ssh_name": "29",
           "uid": "sagittaire-12"
         },
         {
           "kind": "node",
           "port": "eth1",
           "snmp_name": "GigabitEthernet30",
+          "ssh_name": "30",
           "uid": "sagittaire-13"
         },
         {
           "kind": "node",
           "port": "eth1",
           "snmp_name": "GigabitEthernet31",
+          "ssh_name": "31",
           "uid": "sagittaire-14"
         },
         {
           "kind": "node",
           "port": "eth1",
           "snmp_name": "GigabitEthernet32",
+          "ssh_name": "32",
           "uid": "sagittaire-15"
         },
         {
           "kind": "node",
           "port": "eth1",
           "snmp_name": "GigabitEthernet33",
+          "ssh_name": "33",
           "uid": "sagittaire-16"
         }
       ],
diff --git a/data/grid5000/sites/rennes/network_equipments/gw.json b/data/grid5000/sites/rennes/network_equipments/gw.json
index 114a8cb7f9494370dab405d03f88ff7cfa7920f5..ca8c5cd3b34de6852362d3a64ea48e9a39342057 100644
--- a/data/grid5000/sites/rennes/network_equipments/gw.json
+++ b/data/grid5000/sites/rennes/network_equipments/gw.json
@@ -4,31 +4,36 @@
   ],
   "backplane_bps": 1440000000000,
   "channels": {
-    "lag 1": {
+    "lag1": {
       "kind": "switch",
-      "port": "lag 1",
+      "port": "lag1",
       "rate": 200000000000,
+      "ssh_name": "lag 1",
       "uid": "sw-1"
     },
-    "lag 2": {
+    "lag2": {
       "kind": "server",
-      "port": "lag 2",
+      "port": "lag2",
       "rate": 50000000000,
+      "ssh_name": "lag 2",
       "uid": "srv-data"
     },
-    "lag 3": {
+    "lag3": {
       "kind": "switch",
       "port": "port-channel286",
       "rate": 20000000000,
+      "ssh_name": "lag 3",
       "uid": "swcore-01-rba"
     },
-    "lag 4": {
+    "lag4": {
       "kind": "server",
-      "port": "lag 4",
+      "port": "lag4",
       "rate": 50000000000,
+      "ssh_name": "lag 4",
       "uid": "srv-data2"
     }
   },
+  "channels_ssh_pattern": "#{/\\D+/.match(\"%CHANNEL%\")} #{/\\d+/.match(\"%CHANNEL%\")}",
   "ip": "172.16.111.254",
   "ip6": "2001:660:4406:700::ffff:ffff",
   "kind": "router",
@@ -99,12 +104,12 @@
         {
           "kind": "channel",
           "snmp_name": "1/1/29",
-          "uid": "lag 4"
+          "uid": "lag4"
         },
         {
           "kind": "channel",
           "snmp_name": "1/1/30",
-          "uid": "lag 4"
+          "uid": "lag4"
         },
         {
           "kind": "server",
@@ -126,12 +131,12 @@
         {
           "kind": "channel",
           "snmp_name": "1/1/35",
-          "uid": "lag 2"
+          "uid": "lag2"
         },
         {
           "kind": "channel",
           "snmp_name": "1/1/36",
-          "uid": "lag 2"
+          "uid": "lag2"
         },
         {
         },
@@ -174,25 +179,25 @@
           "kind": "channel",
           "rate": 10000000000,
           "snmp_name": "1/1/47",
-          "uid": "lag 3"
+          "uid": "lag3"
         },
         {
           "kind": "channel",
           "rate": 10000000000,
           "snmp_name": "1/1/48",
-          "uid": "lag 3"
+          "uid": "lag3"
         },
         {
           "kind": "channel",
           "rate": 100000000000,
           "snmp_name": "1/1/49",
-          "uid": "lag 1"
+          "uid": "lag1"
         },
         {
           "kind": "channel",
           "rate": 100000000000,
           "snmp_name": "1/1/50",
-          "uid": "lag 1"
+          "uid": "lag1"
         }
       ],
       "rate": 25000000000,
diff --git a/data/grid5000/sites/rennes/network_equipments/sw-1.json b/data/grid5000/sites/rennes/network_equipments/sw-1.json
index d3e20c4ad259f409e876e7f251e5a783f35a3edd..d41cab7ba8080755d760db81ab2d114b22bba004 100644
--- a/data/grid5000/sites/rennes/network_equipments/sw-1.json
+++ b/data/grid5000/sites/rennes/network_equipments/sw-1.json
@@ -1,9 +1,9 @@
 {
   "backplane_bps": 1440000000000,
   "channels": {
-    "lag 1": {
+    "lag1": {
       "kind": "switch",
-      "port": "lag 1",
+      "port": "lag1",
       "rate": 200000000000,
       "uid": "gw"
     }
@@ -247,13 +247,13 @@
           "kind": "channel",
           "rate": 100000000000,
           "snmp_name": "1/1/49",
-          "uid": "lag 1"
+          "uid": "lag1"
         },
         {
           "kind": "channel",
           "rate": 100000000000,
           "snmp_name": "1/1/50",
-          "uid": "lag 1"
+          "uid": "lag1"
         }
       ],
       "rate": 25000000000,
diff --git a/data/grid5000/sites/rennes/network_equipments/swcore-01-rba.json b/data/grid5000/sites/rennes/network_equipments/swcore-01-rba.json
index da9e652d2d5909b7d231b155476e908b7a45d20e..400c54178ec7a6873de0616d3b60043d5b18a836 100644
--- a/data/grid5000/sites/rennes/network_equipments/swcore-01-rba.json
+++ b/data/grid5000/sites/rennes/network_equipments/swcore-01-rba.json
@@ -2,7 +2,7 @@
   "channels": {
     "port-channel286": {
       "kind": "router",
-      "port": "lag 3",
+      "port": "lag3",
       "rate": 20000000000,
       "uid": "gw"
     },
diff --git a/data/grid5000/sites/toulouse/network_equipments/gw.json b/data/grid5000/sites/toulouse/network_equipments/gw.json
index 9d61d806337590d72fff047e2e8cb34460dc3799..6ae7e1099a8acb0c35721b1b7a1e1bc2b4f4d454 100644
--- a/data/grid5000/sites/toulouse/network_equipments/gw.json
+++ b/data/grid5000/sites/toulouse/network_equipments/gw.json
@@ -3,19 +3,22 @@
     "gw-toulouse"
   ],
   "channels": {
-    "lag 1": {
+    "lag1": {
       "kind": "server",
       "port": "port-channel1",
       "rate": 20000000000,
+      "ssh_name": "lag 1",
       "uid": "nfs"
     },
-    "lag 2": {
+    "lag2": {
       "kind": "switch",
       "port": "lacp key 1",
       "rate": 20000000000,
+      "ssh_name": "lag 2",
       "uid": "sw-estats"
     }
   },
+  "channels_ssh_pattern": "#{/\\D+/.match(\"%CHANNEL%\")} #{/\\d+/.match(\"%CHANNEL%\")}",
   "ip": "172.16.127.254",
   "ip6": "2001:660:4406:900::ffff:ffff",
   "kind": "router",
@@ -99,12 +102,12 @@
         {
           "kind": "channel",
           "snmp_name": "1/1/15",
-          "uid": "lag 2"
+          "uid": "lag2"
         },
         {
           "kind": "channel",
           "snmp_name": "1/1/16",
-          "uid": "lag 2"
+          "uid": "lag2"
         },
         {
           "kind": "server",
@@ -119,12 +122,12 @@
         {
           "kind": "channel",
           "snmp_name": "1/1/19",
-          "uid": "lag 1"
+          "uid": "lag1"
         },
         {
           "kind": "channel",
           "snmp_name": "1/1/20",
-          "uid": "lag 1"
+          "uid": "lag1"
         }
       ],
       "rate": 10000000000,
diff --git a/data/grid5000/sites/toulouse/network_equipments/sw-estats.json b/data/grid5000/sites/toulouse/network_equipments/sw-estats.json
index a05ab575cb158f31eff7667a01b989c3ea12eb88..0d9d0a591040787895da9e87a01caba219371065 100644
--- a/data/grid5000/sites/toulouse/network_equipments/sw-estats.json
+++ b/data/grid5000/sites/toulouse/network_equipments/sw-estats.json
@@ -5,7 +5,7 @@
   "channels": {
     "lacp key 1": {
       "kind": "router",
-      "port": "lag 2",
+      "port": "lag2",
       "rate": 20000000000,
       "uid": "gw"
     }
diff --git a/input/grid5000/sites/rennes/networks/gw-rennes.yaml b/input/grid5000/sites/rennes/networks/gw-rennes.yaml
index 9a6f4ba1940e6f80ade9ba60b4f0d40965b54468..d8cf8e3071ef640a24639a66f0ca314c196e35e2 100644
--- a/input/grid5000/sites/rennes/networks/gw-rennes.yaml
+++ b/input/grid5000/sites/rennes/networks/gw-rennes.yaml
@@ -70,10 +70,10 @@ gw:
       rate: 25000000000
       ports:
         29:
-          uid: lag 4
+          uid: lag4
           kind: channel
         30:
-          uid: lag 4
+          uid: lag4
           kind: channel
         31:
           uid: srv-1
@@ -85,10 +85,10 @@ gw:
           uid: srv-3
           kind: server
         35:
-          uid: lag 2
+          uid: lag2
           kind: channel
         36:
-          uid: lag 2
+          uid: lag2
           kind: channel
         43:
           uid: sw-adm-1
@@ -108,39 +108,40 @@ gw:
           kind: backbone
           rate: 10000000000
         47:
-          uid: lag 3
+          uid: lag3
           kind: channel
           rate: 10000000000
         48:
-          uid: lag 3
+          uid: lag3
           kind: channel
           rate: 10000000000
         49:
-          uid: lag 1
+          uid: lag1
           kind: channel
           rate: 100000000000
         50:
-          uid: lag 1
+          uid: lag1
           kind: channel
           rate: 100000000000
+  channels_ssh_pattern: '#{/\D+/.match("%CHANNEL%")} #{/\d+/.match("%CHANNEL%")}'
   channels:
-    lag 1:
+    lag1:
       kind: switch
       rate: 200000000000
       uid: sw-1
-      port: lag 1
-    lag 2:
+      port: lag1
+    lag2:
       kind: server
       rate: 50000000000
       uid: srv-data
-      port: lag 2
-    lag 3:
+      port: lag2
+    lag3:
       kind: switch
       rate: 20000000000
       uid: swcore-01-rba
       port: port-channel286
-    lag 4:
+    lag4:
       kind: server
       rate: 50000000000
       uid: srv-data2
-      port: lag 4
+      port: lag4
diff --git a/input/grid5000/sites/rennes/networks/sw-1.yaml b/input/grid5000/sites/rennes/networks/sw-1.yaml
index 5eec6ef290ab5a29d69035348f8de931571c80a7..defd51c5cdd9e1c39d166351766c6e6f1e63e9c2 100644
--- a/input/grid5000/sites/rennes/networks/sw-1.yaml
+++ b/input/grid5000/sites/rennes/networks/sw-1.yaml
@@ -80,16 +80,16 @@ sw-1:
         32:
           uid: paradoxe-32
         49:
-          uid: lag 1
+          uid: lag1
           kind: channel
           rate: 100000000000
         50:
-          uid: lag 1
+          uid: lag1
           kind: channel
           rate: 100000000000
   channels:
-    lag 1:
+    lag1:
       kind: switch
       rate: 200000000000
       uid: gw
-      port: lag 1
+      port: lag1
diff --git a/input/grid5000/sites/rennes/networks/swcore-01-rba.yaml b/input/grid5000/sites/rennes/networks/swcore-01-rba.yaml
index ca49c4c379b3ce5f8c15fc8e2c8635a0001f46a9..2aea7f2d408d08e2f4ac3527bda9c094435afee5 100644
--- a/input/grid5000/sites/rennes/networks/swcore-01-rba.yaml
+++ b/input/grid5000/sites/rennes/networks/swcore-01-rba.yaml
@@ -51,5 +51,5 @@ swcore-01-rba:
     port-channel286:
       uid: gw
       kind: router
-      port: lag 3
+      port: lag3
       rate: 20000000000
diff --git a/input/grid5000/sites/toulouse/networks/gw.yaml b/input/grid5000/sites/toulouse/networks/gw.yaml
index 223b052ad845993a22c1e70072bba11b0965f7c1..6258a4cc8da235ea3c86a27b12b7e568c7e9ec37 100644
--- a/input/grid5000/sites/toulouse/networks/gw.yaml
+++ b/input/grid5000/sites/toulouse/networks/gw.yaml
@@ -79,10 +79,10 @@ gw:
         9: montcalm-9
         10: montcalm-10
         15:
-          uid: lag 2
+          uid: lag2
           kind: channel
         16:
-          uid: lag 2
+          uid: lag2
           kind: channel
         17:
           uid: pve-1
@@ -91,18 +91,19 @@ gw:
           uid: pve-2
           kind: server
         19:
-          uid: lag 1
+          uid: lag1
           kind: channel
         20:
-          uid: lag 1
+          uid: lag1
           kind: channel
+  channels_ssh_pattern: '#{/\D+/.match("%CHANNEL%")} #{/\d+/.match("%CHANNEL%")}'
   channels:
-    lag 1:
+    lag1:
       uid: nfs
       kind: server
       rate: 20000000000
       port: port-channel1
-    lag 2:
+    lag2:
       uid: sw-estats
       kind: switch
       rate: 20000000000
diff --git a/input/grid5000/sites/toulouse/networks/sw-estats.yaml b/input/grid5000/sites/toulouse/networks/sw-estats.yaml
index 298870592cb9a355fce1242579df4c91057d32f8..1d3d28c1c44f190e9255e19b09a9802fed3925cb 100644
--- a/input/grid5000/sites/toulouse/networks/sw-estats.yaml
+++ b/input/grid5000/sites/toulouse/networks/sw-estats.yaml
@@ -43,4 +43,4 @@ sw-estats:
       uid: gw
       kind: router
       rate: 20000000000
-      port: lag 2
+      port: lag2
diff --git a/lib/refrepo/gen/puppet/kavlanngg5k.rb b/lib/refrepo/gen/puppet/kavlanngg5k.rb
index 972a5e16fbde823e304302404d3bb580010f152e..8ece2ea077ad75aac149a8c6d1445b0ca4017dad 100644
--- a/lib/refrepo/gen/puppet/kavlanngg5k.rb
+++ b/lib/refrepo/gen/puppet/kavlanngg5k.rb
@@ -96,25 +96,32 @@ def gen_kavlanapi_g5k_desc(output_path, options)
   end
 end
 
-def get_port_name(port_index, port, linecard_index, linecard)
-  pattern = nil
-  if linecard.has_key?('kavlan_pattern')
-    pattern = linecard['kavlan_pattern']
-  end
-  if linecard.has_key?('snmp_pattern')
-    pattern = linecard['snmp_pattern']
-  end
-  if port.has_key?('snmp_name')
-    pattern = port['snmp_name']
-  end
-  if linecard.has_key?('ssh_pattern')
-    pattern = linecard['ssh_pattern']
+# compute the port name for NGS ssh commands, based on device,
+# linecard, port, using refapi ssh/kavlan/snmp patterns (with
+# %LINECARD%, %PORT% substitutions), and interpolating the string for
+# ssh_pattern
+def get_port_name(_refapi, site_name, device_name, linecard_index, linecard, port_index, port)
+  # try different possibilities, by order of precedence
+  if port.has_key?('ssh_name')
+    return port['ssh_name']
+  elsif port.has_key?('snmp_name')
+    return port['snmp_name']
+  elsif linecard.has_key?('kavlan_pattern')
+    return get_port_pattern_subst(linecard['kavlan_pattern'], linecard_index, port_index)
+  else
+    puts "WARNING #{site_name}/#{device_name}/linecard-#{lc_index}/port-#{port_index}: unable to guess portname, fallback to port's uid: #{port['uid']}"
+    return port['uid']
   end
-  if pattern
-    port_name = pattern.sub("%LINECARD%",linecard_index.to_s).sub("%PORT%",port_index.to_s)
-    return port_name
+end
+
+# compute the channel name for NGS ssh commands, based on device,
+# using refapi channel_ssh_pattern (with %CHANNEL% substitution), and
+# interpolating the string
+def get_channel_name(_refapi, _site_name, _device_name, channel, channel_name)
+  if channel.has_key?('ssh_name')
+    return channel['ssh_name']
   else
-    return nil
+    return channel_name
   end
 end
 
@@ -126,6 +133,8 @@ def gen_sites_ngs_device_configs(input_path, output_path, options)
   refapi = load_data_hierarchy
   network_devices_data = YAML::load(File.read(input_path))
   network_devices_data.delete_if { |s| !options[:sites].include? s }
+
+  # match devices in kavlanng conf and in refapi
   network_devices_data.each do |site, site_data|
     if options[:verbose]
       puts "  #{site}"
@@ -170,59 +179,61 @@ def gen_sites_ngs_device_configs(input_path, output_path, options)
           site_ngs_conf.puts("ngs_save_configuration = False")
           site_ngs_conf.puts("ngs_manage_vlans = True")
           site_ngs_conf.puts("ngs_physical_networks = g5k, #{site}")
+
+          # trunk ports
           ngs_trunk_ports = []
+
+          # from ports
           if refapi['sites'][site]['network_equipments'][refapi_device].has_key? 'linecards'
             refapi['sites'][site]['network_equipments'][refapi_device]['linecards'].each_with_index do |lc, lc_index|
               if lc.has_key?('ports')
                 lc['ports'].each_with_index do |port, port_index|
                   if port.has_key? 'trunk'
                     if port['trunk']
-                      portname = get_port_name(port_index, port, lc_index, lc)
-                      if not portname
-                        puts "ERROR #{site}/#{refapi_device}/linecard-#{lc_index}/port-#{port_index}: unable to guess portname"
-                      else
-                        if options[:verbose]
-                          puts "      trunk port on #{site}/#{refapi_device}, kind: #{port['kind']}, name: #{portname}"
-                        end
-                        ngs_trunk_ports.push portname
+                      portname = get_port_name(refapi, site, refapi_device, lc_index, lc, port_index, port)
+                      if options[:verbose]
+                        puts "      trunk port on #{site}/#{refapi_device}, kind: #{port['kind']}, name: #{portname}"
                       end
+                      ngs_trunk_ports.push portname
                     end
                   elsif port.has_key? 'kind'
                     if TRUNK_KINDS.include? port['kind']
-                      portname = get_port_name(port_index, port, lc_index, lc)
-                      if not portname
-                        puts "ERROR #{site}/#{refapi_device}/linecard-#{lc_index}/port-#{port_index}: unable to guess portname"
-                      else
-                        if options[:verbose]
-                          puts "      trunk port on #{site}/#{refapi_device}, kind: #{port['kind']}, name: #{portname}"
-                        end
-                        ngs_trunk_ports.push portname
+                      portname = get_port_name(refapi, site, refapi_device, lc_index, lc, port_index, port)
+                      if options[:verbose]
+                        puts "      trunk port on #{site}/#{refapi_device}, kind: #{port['kind']}, name: #{portname}"
                       end
+                      ngs_trunk_ports.push portname
                     end
                   end
                 end
               end
             end
           end
+
+          # from channels
           if refapi['sites'][site]['network_equipments'][refapi_device].has_key? 'channels'
             refapi['sites'][site]['network_equipments'][refapi_device]['channels'].each do |channelname, channel|
               if channel.has_key? 'trunk'
                 if channel['trunk']
+                  actual_channel_name = get_channel_name(refapi, site, refapi_device, channel, channelname)
                   if options[:verbose]
-                    puts "      trunk channel on #{site}/#{refapi_device}, kind: #{channel['kind']}, name: #{channelname}"
+                    puts "      trunk channel on #{site}/#{refapi_device}, kind: #{channel['kind']}, name: #{actual_channel_name}"
                   end
-                  ngs_trunk_ports.push channelname
+                  ngs_trunk_ports.push actual_channel_name
                 end
               elsif channel.has_key? 'kind'
                 if TRUNK_KINDS.include? channel['kind']
+                  actual_channel_name = get_channel_name(refapi, site, refapi_device, channel, channelname)
                   if options[:verbose]
-                    puts "      trunk channel on #{site}/#{refapi_device}, kind: #{channel['kind']}, name: #{channelname}"
+                    puts "      trunk channel on #{site}/#{refapi_device}, kind: #{channel['kind']}, name: #{actual_channel_name}"
                   end
-                  ngs_trunk_ports.push channelname
+                  ngs_trunk_ports.push actual_channel_name
                 end
               end
             end
           end
+
+          # additional trunk ports
           if device_data.has_key? 'additional_trunk_ports'
             device_data['additional_trunk_ports'].each do |additional_trunk_port|
               if options[:verbose]
diff --git a/lib/refrepo/input_loader.rb b/lib/refrepo/input_loader.rb
index 7c5860d1665b3dda4828121a65858c7022c54175..ed1732ee73e2aff1a372792c181d2e84fccdf5e6 100644
--- a/lib/refrepo/input_loader.rb
+++ b/lib/refrepo/input_loader.rb
@@ -788,6 +788,28 @@ def add_gpu_information(h)
   end
 end
 
+def get_port_pattern_subst(pattern, linecard_index, port_index)
+  return pattern.gsub("%LINECARD%", linecard_index.to_s).sub("%PORT%", port_index.to_s)
+end
+
+def get_port_pattern_interpolation(pattern, linecard_index, port_index)
+  # reimplement with eval the ruby string interpolation mechanism (#{})
+  # WARNING: it means that code from the input yaml will be executed (thus input yamls may be used as attack vectors)
+  #return eval('"' + get_port_pattern_subst(pattern, linecard_index, port_index).gsub(/"/, '\"') + '"')
+  return eval('"' + get_port_pattern_subst(pattern, linecard_index, port_index) + '"')
+end
+
+def get_channel_pattern_subst(pattern, channel_name)
+  return pattern.gsub("%CHANNEL%", channel_name)
+end
+
+def get_channel_pattern_interpolation(pattern, channel_name)
+  # reimplement with eval the ruby string interpolation mechanism (#{})
+  # WARNING: it means that code from the input yaml will be executed (thus input yamls may be used as attack vectors)
+  #return eval('"' + get_channel_pattern_subst(pattern, channel_name).gsub(/"/, '\"') + '"')
+  return eval('"' + get_channel_pattern_subst(pattern, channel_name) + '"')
+end
+
 def complete_one_network_equipment(network_uid, network)
   network["type"] = "network_equipment"
   network["uid"]  = network_uid
@@ -810,10 +832,16 @@ def complete_one_network_equipment(network_uid, network)
           port['snmp_pattern'] = linecard['snmp_pattern']
         end
         if port['snmp_pattern']
-          port['snmp_name'] = port['snmp_pattern']
-          .sub('%LINECARD%',linecard_index.to_s).sub('%PORT%',port_index.to_s)
+          port['snmp_name'] = get_port_pattern_subst(port['snmp_pattern'], linecard_index, port_index)
           port.delete('snmp_pattern')
         end
+        if port['ssh_pattern'].nil? and linecard['ssh_pattern']
+          port['ssh_pattern'] = linecard['ssh_pattern']
+        end
+        if port['ssh_pattern']
+          port['ssh_name'] = get_port_pattern_interpolation(port['ssh_pattern'], linecard_index, port_index)
+          port.delete('ssh_pattern')
+        end
         if ((!linecard['kind'].nil? &&
              port['kind'].nil? &&
              linecard['kind'] == 'node') ||
@@ -830,6 +858,19 @@ def complete_one_network_equipment(network_uid, network)
     linecards_array[linecard_index] = linecard
   end
   network["linecards"] = linecards_array.map{|l| l || {}}
+
+  # Channels
+  if network.key?('channels')
+    network['channels'].each do |channel_name, channel|
+      if channel['ssh_pattern'].nil? and network['channels_ssh_pattern']
+        channel['ssh_pattern'] = network['channels_ssh_pattern']
+      end
+      if channel['ssh_pattern']
+        channel['ssh_name'] = get_channel_pattern_interpolation(channel['ssh_pattern'], channel_name)
+        channel.delete('ssh_pattern')
+      end
+    end
+  end
 end
 
 def complete_network_equipments(h)
diff --git a/lib/refrepo/valid/input/lib/custom_validators.rb b/lib/refrepo/valid/input/lib/custom_validators.rb
index 475324e7b529ab5f6507a8f55a5bc942421d46c5..1eff15fb3df81a4f4cbd4cdbb9c7d3c0b048ecb6 100644
--- a/lib/refrepo/valid/input/lib/custom_validators.rb
+++ b/lib/refrepo/valid/input/lib/custom_validators.rb
@@ -15,6 +15,7 @@ class HashValidator::Validator::LinecardPortValidator < HashValidator::Validator
       'snmp_pattern' => HashValidator.optional('string'),
       'snmp_name' => HashValidator.optional('string'),
       'kavlan_pattern' => HashValidator.optional('string'),
+      'ssh_name' => HashValidator.optional('string'),
     }
   end
 
diff --git a/lib/refrepo/valid/input/schemas/schema-network_equipments.yaml b/lib/refrepo/valid/input/schemas/schema-network_equipments.yaml
index 8e909d9187b2b3d5dd6dfa38d6bf00c9510f4c2b..06567195f5bc665ffbb90b7dcfe647db2c5b7121 100644
--- a/lib/refrepo/valid/input/schemas/schema-network_equipments.yaml
+++ b/lib/refrepo/valid/input/schemas/schema-network_equipments.yaml
@@ -39,6 +39,7 @@ linecards:
       port: optional_string
       ports:
         <optional_array>: linecard_port
+channels_ssh_pattern: optional_string
 channels:
   <optional_hash>:
     <multi>:
@@ -47,6 +48,7 @@ channels:
       kind: string
       rate: integer
       trunk: optional_boolean
+      ssh_name: optional_string
 metrics: optional_array
 uid: string
 type: string