add basic integrity checks for config variables
[racktables] / wwwroot / inc / navigation.php
index a0a4fc6..d64c407 100644 (file)
@@ -1,7 +1,12 @@
 <?php
+
+# This file is a part of RackTables, a datacenter and server room management
+# framework. See accompanying file "COPYING" for the full copyright and
+# licensing information.
+
 /*
 
-This file contains a series of arrays, which define RackTables as a tree
+This file contains a series of arrays that define RackTables as a tree
 of discrete views ("pages"). Each such page may be in turn split info a set of
 "tabs". In the latter case it is also possible to define a set of "operations"
 for a particular combination of page and tab (location). These operations
@@ -10,7 +15,7 @@ provided to be executed correctly (constraints on the additional data are
 defined and validated in ophandlers.php).
 
 Every page split into tabs must define a tab internally named "default". It is
-assumed, that this default tab never defines any operations and thus remains
+assumed that this default tab never defines any operations and thus remains
 read-only.
 
 */
@@ -18,15 +23,36 @@ read-only.
 $page = array();
 $tab = array();
 $trigger = array();
+
 $ophandler = array();
 $tabhandler = array();
+$hook = array();
+$ophandlers_stack = array();
+$tabhandlers_stack = array();
+$hooks_stack = array();
+
 $delayauth = array();
+$svghandler = array();
+$ajaxhandler = array();
+
+/*
+Syntax:
+// Require file.php when processing tab "tab" of the page "page":
+$interface_requires['page-tab'] = array ('file.php');
+
+// Same, different notation:
+$interface_requires['page-tab'] = 'file.php';
+
+// Require three files for every tab of the page "page":
+$interface_requires['page-*'] = array ('file1.php', 'file2.php', 'file3.php');
+*/
+$interface_requires = array();
 
 $indexlayout = array
 (
        array ('rackspace', 'depot', 'ipv4space', 'ipv6space'),
        array ('files', 'reports', 'ipv4slb', '8021q'),
-       array ('config', 'objectlog', 'virtual'),
+       array ('config', 'objectlog', 'virtual', 'cables'),
 );
 
 $page['index']['title'] = 'Main page';
@@ -35,14 +61,19 @@ $page['index']['handler'] = 'renderIndex';
 $page['rackspace']['title'] = 'Rackspace';
 $page['rackspace']['parent'] = 'index';
 $tab['rackspace']['default'] = 'Browse';
-$tab['rackspace']['edit'] = 'Manage rows';
+$tab['rackspace']['editlocations'] = 'Manage locations';
+$tab['rackspace']['editrows'] = 'Manage rows';
 $tab['rackspace']['history'] = 'History';
 $tabhandler['rackspace']['default'] = 'renderRackspace';
-$tabhandler['rackspace']['edit'] = 'renderRackspaceRowEditor';
+$tabhandler['rackspace']['editlocations'] = 'renderRackspaceLocationEditor';
+$tabhandler['rackspace']['editrows'] = 'renderRackspaceRowEditor';
 $tabhandler['rackspace']['history'] = 'renderRackspaceHistory';
-$ophandler['rackspace']['edit']['addRow'] = 'tableHandler';
-$ophandler['rackspace']['edit']['delete'] = 'tableHandler';
-$ophandler['rackspace']['edit']['updateRow'] = 'tableHandler';
+$ophandler['rackspace']['editlocations']['addLocation'] = 'addLocation';
+$ophandler['rackspace']['editlocations']['updateLocation'] = 'updateLocation';
+$ophandler['rackspace']['editlocations']['deleteLocation'] = 'deleteLocation';
+$ophandler['rackspace']['editrows']['addRow'] = 'addRow';
+$ophandler['rackspace']['editrows']['updateRow'] = 'updateRow';
+$ophandler['rackspace']['editrows']['deleteRow'] = 'deleteRow';
 
 $page['depot']['parent'] = 'index';
 $page['depot']['title'] = 'Objects';
@@ -54,29 +85,71 @@ $ophandler['depot']['addmore']['addObjects'] = 'addMultipleObjects';
 $ophandler['depot']['addmore']['addLotOfObjects'] = 'addLotOfObjects';
 $ophandler['depot']['addmore']['deleteObject'] = 'deleteObject';
 
+$page['location']['bypass'] = 'location_id';
+$page['location']['bypass_type'] = 'natural';
+$page['location']['parent'] = 'rackspace';
+$tab['location']['default'] = 'View';
+$tab['location']['edit'] = 'Properties';
+$tab['location']['log'] = 'Log';
+$tab['location']['tags'] = 'Tags';
+$tab['location']['files'] = 'Files';
+$tabhandler['location']['default'] = 'renderLocationPage';
+$tabhandler['location']['edit'] = 'renderEditLocationForm';
+$tabhandler['location']['log'] = 'renderObjectLogEditor';
+$tabhandler['location']['tags'] = 'renderEntityTags';
+$tabhandler['location']['files'] = 'renderFilesForEntity';
+$trigger['location']['tags'] = 'trigger_tags';
+$ophandler['location']['edit']['clearSticker'] = 'clearSticker';
+$ophandler['location']['edit']['updateLocation'] = 'updateLocation';
+$ophandler['location']['edit']['deleteLocation'] = 'deleteLocation';
+$ophandler['location']['log']['add'] = 'addObjectlog';
+$ophandler['location']['log']['del'] = 'tableHandler';
+$ophandler['location']['tags']['saveTags'] = 'saveEntityTags';
+$ophandler['location']['files']['addFile'] = 'addFileToEntity';
+$ophandler['location']['files']['linkFile'] = 'linkFileToEntity';
+$ophandler['location']['files']['unlinkFile'] = 'unlinkFile';
+
 $page['row']['bypass'] = 'row_id';
-$page['row']['bypass_type'] = 'uint';
+$page['row']['bypass_type'] = 'natural';
 $page['row']['parent'] = 'rackspace';
 $tab['row']['default'] = 'View';
+$tab['row']['edit'] = 'Properties';
+$tab['row']['editracks'] = 'Manage racks';
 $tab['row']['newrack'] = 'Add new rack';
+$tab['row']['log'] = 'Log';
 $tab['row']['tagroller'] = 'Tag roller';
+$tab['row']['files'] = 'Files';
 $tabhandler['row']['default'] = 'renderRow';
+$tabhandler['row']['edit'] = 'renderEditRowForm';
+$tabhandler['row']['editracks'] = 'renderRackSortForm';
 $tabhandler['row']['newrack'] = 'renderNewRackForm';
+$tabhandler['row']['log'] = 'renderObjectLogEditor';
 $tabhandler['row']['tagroller'] = 'renderTagRollerForRow';
-$ophandler['row']['tagroller']['rollTags'] = 'rollTags';
+$tabhandler['row']['files'] = 'renderFilesForEntity';
+$ophandler['row']['edit']['clearSticker'] = 'clearSticker';
+$ophandler['row']['edit']['deleteRow'] = 'deleteRow';
+$ophandler['row']['edit']['updateRow'] = 'updateRow';
 $ophandler['row']['newrack']['addRack'] = 'addRack';
+$ophandler['row']['log']['add'] = 'addObjectlog';
+$ophandler['row']['log']['del'] = 'tableHandler';
+$ophandler['row']['tagroller']['rollTags'] = 'rollTags';
+$ophandler['row']['files']['addFile'] = 'addFileToEntity';
+$ophandler['row']['files']['linkFile'] = 'linkFileToEntity';
+$ophandler['row']['files']['unlinkFile'] = 'unlinkFile';
 
 $page['rack']['bypass'] = 'rack_id';
-$page['rack']['bypass_type'] = 'uint';
+$page['rack']['bypass_type'] = 'natural';
 $page['rack']['parent'] = 'row';
 $tab['rack']['default'] = 'View';
 $tab['rack']['edit'] = 'Properties';
+$tab['rack']['log'] = 'Log';
 $tab['rack']['design'] = 'Design';
 $tab['rack']['problems'] = 'Problems';
 $tab['rack']['tags'] = 'Tags';
 $tab['rack']['files'] = 'Files';
 $tabhandler['rack']['default'] = 'renderRackPage';
 $tabhandler['rack']['edit'] = 'renderEditRackForm';
+$tabhandler['rack']['log'] = 'renderObjectLogEditor';
 $tabhandler['rack']['design'] = 'renderRackDesign';
 $tabhandler['rack']['problems'] = 'renderRackProblems';
 $tabhandler['rack']['tags'] = 'renderEntityTags';
@@ -84,97 +157,95 @@ $tabhandler['rack']['files'] = 'renderFilesForEntity';
 $trigger['rack']['tags'] = 'trigger_tags';
 $ophandler['rack']['design']['updateRack'] = 'updateRackDesign';
 $ophandler['rack']['problems']['updateRack'] = 'updateRackProblems';
+$ophandler['rack']['edit']['clearSticker'] = 'clearSticker';
 $ophandler['rack']['edit']['updateRack'] = 'updateRack';
 $ophandler['rack']['edit']['deleteRack'] = 'deleteRack';
+$ophandler['rack']['edit']['cleanRack'] = 'cleanRack';
+$ophandler['rack']['log']['add'] = 'addObjectlog';
+$ophandler['rack']['log']['del'] = 'tableHandler';
 $ophandler['rack']['tags']['saveTags'] = 'saveEntityTags';
 $ophandler['rack']['files']['addFile'] = 'addFileToEntity';
 $ophandler['rack']['files']['linkFile'] = 'linkFileToEntity';
 $ophandler['rack']['files']['unlinkFile'] = 'unlinkFile';
 
 $page['object']['bypass'] = 'object_id';
-$page['object']['bypass_type'] = 'uint';
-$page['object']['bypass_tabs'] = array ('hl_port_id');
+$page['object']['bypass_type'] = 'natural';
+$page['object']['bypass_tabs'] = array ('hl_port_id', 'hl_ip');
 $page['object']['parent'] = 'depot';
 $tab['object']['default'] = 'View';
 $tab['object']['edit'] = 'Properties';
 $tab['object']['log'] = 'Log';
 $tab['object']['rackspace'] = 'Rackspace';
 $tab['object']['ports'] = 'Ports';
-$tab['object']['ipv4'] = 'IPv4';
-$tab['object']['ipv6'] = 'IPv6';
+$tab['object']['ip'] = 'IP';
 $tab['object']['nat4'] = 'NATv4';
-$tab['object']['livevlans'] = 'Live VLANs';
 $tab['object']['liveports'] = 'Live ports';
 $tab['object']['livecdp'] = 'Live CDP';
 $tab['object']['livelldp'] = 'Live LLDP';
-$tab['object']['livehndp'] = 'Live HNDP';
 $tab['object']['snmpportfinder'] = 'SNMP sync';
-$tab['object']['editrspvs'] = 'RS pools';
+$tab['object']['editrspvs'] = 'VS links';
+$tab['object']['editvslinks'] = 'VSG links';
 $tab['object']['lvsconfig'] = 'keepalived.conf';
 $tab['object']['autoports'] = 'AutoPorts';
 $tab['object']['tags'] = 'Tags';
 $tab['object']['files'] = 'Files';
+$tab['object']['ucs'] = 'UCS';
 $tab['object']['8021qorder'] = '802.1Q order';
 $tab['object']['8021qports'] = '802.1Q ports';
 $tab['object']['8021qsync'] = '802.1Q sync';
-$tabhandler['object']['default'] = 'renderRackObject';
+$tabhandler['object']['default'] = 'renderObject';
 $tabhandler['object']['edit'] = 'renderEditObjectForm';
 $tabhandler['object']['log'] = 'renderObjectLogEditor';
 $tabhandler['object']['rackspace'] = 'renderRackSpaceForObject';
 $tabhandler['object']['ports'] = 'renderPortsForObject';
-$tabhandler['object']['ipv4'] = 'renderIPv4ForObject';
-$tabhandler['object']['ipv6'] = 'renderIPv6ForObject';
+$tabhandler['object']['ip'] = 'renderIPForObject';
 $tabhandler['object']['nat4'] = 'renderNATv4ForObject';
-$tabhandler['object']['livevlans'] = 'renderVLANMembership';
 $tabhandler['object']['liveports'] = 'renderPortsInfo';
 $tabhandler['object']['livecdp'] = 'renderDiscoveredNeighbors';
 $tabhandler['object']['livelldp'] = 'renderDiscoveredNeighbors';
-$tabhandler['object']['livehndp'] = 'renderDiscoveredNeighbors';
 $tabhandler['object']['snmpportfinder'] = 'renderSNMPPortFinder';
 $tabhandler['object']['lvsconfig'] = 'renderLVSConfig';
 $tabhandler['object']['autoports'] = 'renderAutoPortsForm';
 $tabhandler['object']['tags'] = 'renderEntityTags';
 $tabhandler['object']['files'] = 'renderFilesForEntity';
-$tabhandler['object']['editrspvs'] = 'renderObjectSLB';
+$tabhandler['object']['editrspvs'] = 'renderSLBEditTab';
+$tabhandler['object']['editvslinks'] = 'renderTripletForm';
 $tabhandler['object']['8021qorder'] = 'render8021QOrderForm';
 $tabhandler['object']['8021qports'] = 'renderObject8021QPorts';
 $tabhandler['object']['8021qsync'] = 'renderObject8021QSync';
+$tabhandler['object']['ucs'] = 'renderEditUCSForm';
 $trigger['object']['rackspace'] = 'trigger_rackspace';
 $trigger['object']['ports'] = 'trigger_ports';
-$trigger['object']['ipv4'] = 'trigger_ipv4';
-$trigger['object']['ipv6'] = 'trigger_ipv6';
+$trigger['object']['ip'] = 'trigger_ip';
 $trigger['object']['nat4'] = 'trigger_natv4';
-$trigger['object']['livevlans'] = 'trigger_livevlans';
 $trigger['object']['liveports'] = 'trigger_liveports';
 $trigger['object']['livecdp'] = 'trigger_LiveCDP';
 $trigger['object']['livelldp'] = 'trigger_LiveLLDP';
-$trigger['object']['livehndp'] = 'trigger_LiveHNDP';
 $trigger['object']['snmpportfinder'] = 'trigger_snmpportfinder';
 $trigger['object']['editrspvs'] = 'trigger_isloadbalancer';
+$trigger['object']['editvslinks'] = 'trigger_isloadbalancer';
 $trigger['object']['lvsconfig'] = 'trigger_isloadbalancer';
 $trigger['object']['autoports'] = 'trigger_autoports';
 $trigger['object']['tags'] = 'trigger_tags';
 $trigger['object']['8021qorder'] = 'trigger_object_8021qorder';
 $trigger['object']['8021qports'] = 'trigger_object_8021qports';
 $trigger['object']['8021qsync'] = 'trigger_object_8021qsync';
-$ophandler['object']['edit']['linkEntities'] = 'linkEntities';
-$ophandler['object']['edit']['unlinkEntities'] = 'unlinkEntities';
+$trigger['object']['ucs'] = 'trigger_ucs';
+$ophandler['object']['edit']['linkObjects'] = 'linkObjects';
+$ophandler['object']['edit']['unlinkObjects'] = 'tableHandler';
 $ophandler['object']['rackspace']['updateObjectAllocation'] = 'updateObjectAllocation';
 $ophandler['object']['ports']['addPort'] = 'addPortForObject';
 $ophandler['object']['ports']['editPort'] = 'editPortForObject';
-$ophandler['object']['ports']['linkPort'] = 'linkPortForObject';
 $ophandler['object']['ports']['addMultiPorts'] = 'addMultiPorts';
 $ophandler['object']['ports']['addBulkPorts'] = 'addBulkPorts';
-$ophandler['object']['ports']['useup'] = 'useupPort';
+$ophandler['object']['ports']['useup'] = 'tableHandler';
 $ophandler['object']['ports']['delPort'] = 'tableHandler';
 $ophandler['object']['ports']['deleteAll'] = 'tableHandler';
-$ophandler['object']['ports']['unlinkPort'] = 'tableHandler';
-$ophandler['object']['ipv4']['updIPv4Allocation'] = 'updIPv4Allocation';
-$ophandler['object']['ipv4']['addIPv4Allocation'] = 'addIPv4Allocation';
-$ophandler['object']['ipv4']['delIPv4Allocation'] = 'delIPv4Allocation';
-$ophandler['object']['ipv6']['updIPv6Allocation'] = 'updIPv6Allocation';
-$ophandler['object']['ipv6']['addIPv6Allocation'] = 'addIPv6Allocation';
-$ophandler['object']['ipv6']['delIPv6Allocation'] = 'delIPv6Allocation';
+$ophandler['object']['ports']['renameAll'] = 'renameObjectPorts';
+$ophandler['object']['ports']['unlinkPort'] = 'unlinkPort';
+$ophandler['object']['ip']['upd'] = 'updIPAllocation';
+$ophandler['object']['ip']['add'] = 'addIPAllocation';
+$ophandler['object']['ip']['del'] = 'delIPAllocation';
 $ophandler['object']['edit']['clearSticker'] = 'clearSticker';
 $ophandler['object']['edit']['update'] = 'updateObject';
 $ophandler['object']['edit']['resetObject'] = 'resetObject';
@@ -183,7 +254,6 @@ $ophandler['object']['log']['del'] = 'tableHandler';
 $ophandler['object']['nat4']['addNATv4Rule'] = 'addPortForwarding';
 $ophandler['object']['nat4']['delNATv4Rule'] = 'delPortForwarding';
 $ophandler['object']['nat4']['updNATv4Rule'] = 'updPortForwarding';
-$ophandler['object']['livevlans']['setPortVLAN'] = 'setPortVLAN';
 $ophandler['object']['livecdp']['importDPData'] = 'importDPData';
 $ophandler['object']['livelldp']['importDPData'] = 'importDPData';
 $ophandler['object']['autoports']['generate'] = 'generateAutoPorts';
@@ -194,6 +264,10 @@ $ophandler['object']['files']['unlinkFile'] = 'unlinkFile';
 $ophandler['object']['editrspvs']['addLB'] = 'addLoadBalancer';
 $ophandler['object']['editrspvs']['delLB'] = 'tableHandler';
 $ophandler['object']['editrspvs']['updLB'] = 'tableHandler';
+$ophandler['object']['editvslinks']['addLink'] = 'createTriplet';
+$ophandler['object']['editvslinks']['del'] = 'removeTriplet';
+$ophandler['object']['editvslinks']['updPort'] = 'updateTripletConfig';
+$ophandler['object']['editvslinks']['updIp'] = 'updateTripletConfig';
 $ophandler['object']['lvsconfig']['submitSLBConfig'] = 'submitSLBConfig';
 $ophandler['object']['snmpportfinder']['querySNMPData'] = 'querySNMPData';
 $ophandler['object']['8021qorder']['add'] = 'add8021QOrder';
@@ -203,35 +277,47 @@ $ophandler['object']['8021qports']['exec8021QRecalc'] = 'process8021QRecalcReque
 $ophandler['object']['8021qsync']['exec8021QPull'] = 'process8021QSyncRequest';
 $ophandler['object']['8021qsync']['exec8021QPush'] = 'process8021QSyncRequest';
 $ophandler['object']['8021qsync']['resolve8021QConflicts'] = 'resolve8021QConflicts';
-$delayauth['object']['8021qports']['save8021QConfig'] = TRUE;
-$delayauth['object']['livevlans']['setPortVLAN'] = TRUE;
+$ophandler['object']['8021qsync']['updPortList'] = 'update8021QPortList';
+$ophandler['object']['ucs']['autoPopulateUCS'] = 'autoPopulateUCS';
+$ophandler['object']['ucs']['cleanupUCS'] = 'cleanupUCS';
+$delayauth['object-8021qports-save8021QConfig'] = TRUE;
+$delayauth['object-8021qorder-add'] = TRUE;
+$delayauth['object-8021qorder-del'] = TRUE;
+$interface_requires['object-8021qorder'] = 'interface-8021q.php';
+$interface_requires['object-8021qports'] = 'interface-8021q.php';
+$interface_requires['object-8021qsync'] = 'interface-8021q.php';
 
 $page['ipv4space']['parent'] = 'index';
 $tab['ipv4space']['default'] = 'Browse';
-$tab['ipv4space']['newrange'] = 'Manage';
-$tabhandler['ipv4space']['default'] = 'renderIPv4Space';
-$tabhandler['ipv4space']['newrange'] = 'renderIPv4SpaceEditor';
-$ophandler['ipv4space']['newrange']['addIPv4Prefix'] = 'addIPv4Prefix';
-$ophandler['ipv4space']['newrange']['delIPv4Prefix'] = 'delIPv4Prefix';
+$tab['ipv4space']['newrange'] = 'Add';
+$tab['ipv4space']['manage'] = 'Delete';
+$tabhandler['ipv4space']['default'] = 'renderIPSpace';
+$tabhandler['ipv4space']['newrange'] = 'renderIPNewNetForm';
+$tabhandler['ipv4space']['manage'] = 'renderIPSpaceEditor';
+$ophandler['ipv4space']['newrange']['add'] = 'addIPv4Prefix';
+$ophandler['ipv4space']['manage']['del'] = 'delIPv4Prefix';
 
 $page['ipv6space']['parent'] = 'index';
 $tab['ipv6space']['default'] = 'Browse';
-$tab['ipv6space']['newrange'] = 'Manage';
-$tabhandler['ipv6space']['default'] = 'renderIPv6Space';
-$tabhandler['ipv6space']['newrange'] = 'renderIPv6SpaceEditor';
-$ophandler['ipv6space']['newrange']['addIPv6Prefix'] = 'addIPv6Prefix';
-$ophandler['ipv6space']['newrange']['delIPv6Prefix'] = 'delIPv6Prefix';
+$tab['ipv6space']['newrange'] = 'Add';
+$tab['ipv6space']['manage'] = 'Delete';
+$tabhandler['ipv6space']['default'] = 'renderIPSpace';
+$tabhandler['ipv6space']['newrange'] = 'renderIPNewNetForm';
+$tabhandler['ipv6space']['manage'] = 'renderIPSpaceEditor';
+$ophandler['ipv6space']['newrange']['add'] = 'addIPv6Prefix';
+$ophandler['ipv6space']['manage']['del'] = 'delIPv6Prefix';
 
 $page['ipv4net']['parent'] = 'ipv4space';
 $page['ipv4net']['bypass'] = 'id';
-$page['ipv4net']['bypass_type'] = 'uint';
+$page['ipv4net']['bypass_type'] = 'natural';
+$page['ipv4net']['bypass_tabs'] = array ('pg');
 $tab['ipv4net']['default'] = 'Browse';
 $tab['ipv4net']['properties'] = 'Properties';
 $tab['ipv4net']['liveptr'] = 'Live PTR';
 $tab['ipv4net']['tags'] = 'Tags';
 $tab['ipv4net']['files'] = 'Files';
 $tab['ipv4net']['8021q'] = '802.1Q';
-$tabhandler['ipv4net']['default'] = 'renderIPv4Network';
+$tabhandler['ipv4net']['default'] = 'renderIPNetwork';
 $tabhandler['ipv4net']['properties'] = 'renderIPNetworkProperties';
 $tabhandler['ipv4net']['liveptr'] = 'renderLivePTR';
 $tabhandler['ipv4net']['tags'] = 'renderEntityTags';
@@ -239,7 +325,8 @@ $tabhandler['ipv4net']['files'] = 'renderFilesForEntity';
 $tabhandler['ipv4net']['8021q'] = 'renderVLANIPLinks';
 $trigger['ipv4net']['tags'] = 'trigger_tags';
 $trigger['ipv4net']['8021q'] = 'trigger_ipv4net_vlanconfig';
-$ophandler['ipv4net']['properties']['editRange'] = 'tableHandler';
+$ophandler['ipv4net']['properties']['editRange'] = 'editIPv4Net';
+$ophandler['ipv4net']['properties']['del'] = 'delIPv4Prefix';
 $ophandler['ipv4net']['liveptr']['importPTRData'] = 'importPTRData';
 $ophandler['ipv4net']['tags']['saveTags'] = 'saveEntityTags';
 $ophandler['ipv4net']['files']['addFile'] = 'addFileToEntity';
@@ -247,90 +334,91 @@ $ophandler['ipv4net']['files']['linkFile'] = 'linkFileToEntity';
 $ophandler['ipv4net']['files']['unlinkFile'] = 'unlinkFile';
 $ophandler['ipv4net']['8021q']['bind'] = 'bindVLANtoIPv4';
 $ophandler['ipv4net']['8021q']['unbind'] = 'unbindVLANfromIPv4';
+$interface_requires['ipv4net-8021q'] = 'interface-8021q.php';
 
 $page['ipv6net']['parent'] = 'ipv6space';
 $page['ipv6net']['bypass'] = 'id';
-$page['ipv6net']['bypass_type'] = 'uint';
+$page['ipv6net']['bypass_type'] = 'natural';
 $tab['ipv6net']['default'] = 'Browse';
 $tab['ipv6net']['properties'] = 'Properties';
 $tab['ipv6net']['tags'] = 'Tags';
 $tab['ipv6net']['files'] = 'Files';
 $tab['ipv6net']['8021q'] = '802.1Q';
-$tabhandler['ipv6net']['default'] = 'renderIPv6Network';
+$tabhandler['ipv6net']['default'] = 'renderIPNetwork';
 $tabhandler['ipv6net']['properties'] = 'renderIPNetworkProperties';
 $tabhandler['ipv6net']['tags'] = 'renderEntityTags';
 $tabhandler['ipv6net']['files'] = 'renderFilesForEntity';
 $tabhandler['ipv6net']['8021q'] = 'renderVLANIPLinks';
 $trigger['ipv6net']['tags'] = 'trigger_tags';
 $trigger['ipv6net']['8021q'] = 'trigger_ipv6net_vlanconfig';
-$ophandler['ipv6net']['properties']['editRange'] = 'tableHandler';
+$ophandler['ipv6net']['properties']['editRange'] = 'editIPv6Net';
+$ophandler['ipv6net']['properties']['del'] = 'delIPv6Prefix';
 $ophandler['ipv6net']['tags']['saveTags'] = 'saveEntityTags';
 $ophandler['ipv6net']['files']['addFile'] = 'addFileToEntity';
 $ophandler['ipv6net']['files']['linkFile'] = 'linkFileToEntity';
 $ophandler['ipv6net']['files']['unlinkFile'] = 'unlinkFile';
 $ophandler['ipv6net']['8021q']['bind'] = 'bindVLANtoIPv6';
 $ophandler['ipv6net']['8021q']['unbind'] = 'unbindVLANfromIPv6';
+$interface_requires['ipv6net-8021q'] = 'interface-8021q.php';
 
-$page['ipaddress']['parent'] = 'ipv4net';
+//$page['ipaddress']['parent'] = 'ipnet'; - this is commented intentionally, there is a special hack in getPath
 $page['ipaddress']['bypass'] = 'ip';
-$page['ipaddress']['bypass_type'] = 'inet4';
+$page['ipaddress']['bypass_type'] = 'inet';
 $tab['ipaddress']['default'] = 'Browse';
 $tab['ipaddress']['properties'] = 'Properties';
 $tab['ipaddress']['assignment'] = 'Allocation';
+$tab['ipaddress']['log'] = 'Change log';
 $tabhandler['ipaddress']['default'] = 'renderIPAddress';
 $tabhandler['ipaddress']['properties'] = 'renderIPAddressProperties';
 $tabhandler['ipaddress']['assignment'] = 'renderIPAddressAllocations';
+$tabhandler['ipaddress']['log'] = 'renderIPAddressLog';
+$trigger['ipaddress']['log'] = 'triggerIPAddressLog';
 $ophandler['ipaddress']['properties']['editAddress'] = 'editAddress';
-$ophandler['ipaddress']['assignment']['delIPv4Allocation'] = 'delIPv4Allocation';
-$ophandler['ipaddress']['assignment']['updIPv4Allocation'] = 'updIPv4Allocation';
-$ophandler['ipaddress']['assignment']['addIPv4Allocation'] = 'addIPv4Allocation';
-
-$page['ipv6address']['parent'] = 'ipv6net';
-$page['ipv6address']['bypass'] = 'ip';
-$page['ipv6address']['bypass_type'] = 'string';
-$tab['ipv6address']['default'] = 'Browse';
-$tab['ipv6address']['properties'] = 'Properties';
-$tab['ipv6address']['assignment'] = 'Allocation';
-$tabhandler['ipv6address']['default'] = 'renderIPAddress';
-$tabhandler['ipv6address']['properties'] = 'renderIPAddressProperties';
-$tabhandler['ipv6address']['assignment'] = 'renderIPAddressAllocations';
-$ophandler['ipv6address']['properties']['editAddress'] = 'editv6Address';
-$ophandler['ipv6address']['assignment']['delIPv6Allocation'] = 'delIPv6Allocation';
-$ophandler['ipv6address']['assignment']['updIPv6Allocation'] = 'updIPv6Allocation';
-$ophandler['ipv6address']['assignment']['addIPv6Allocation'] = 'addIPv6Allocation';
-
-$page['ipv4slb']['title'] = 'IPv4 SLB';
+$ophandler['ipaddress']['assignment']['del'] = 'delIPAllocation';
+$ophandler['ipaddress']['assignment']['upd'] = 'updIPAllocation';
+$ophandler['ipaddress']['assignment']['add'] = 'addIPAllocation';
+
+$page['ipv4slb']['title'] = 'IP SLB';
 $page['ipv4slb']['parent'] = 'index';
-$tab['ipv4slb']['default'] = 'Browse';
+$tab['ipv4slb']['default'] = 'Virtual services';
+$tab['ipv4slb']['vs'] = 'VS groups';
+$tab['ipv4slb']['lbs'] = 'Load balancers';
+$tab['ipv4slb']['rspools'] = 'RS pools';
+$tab['ipv4slb']['rservers'] = 'Real servers';
 $tab['ipv4slb']['defconfig'] = 'Default configs';
-$tabhandler['ipv4slb']['default'] = 'renderIPv4SLB';
+$tab['ipv4slb']['new_vs'] = 'new VS';
+$tab['ipv4slb']['new_vsg'] = 'new VS group';
+$tab['ipv4slb']['new_rs'] = 'new RS pool';
+$tabhandler['ipv4slb']['default'] = 'renderVSList';
+$tabhandler['ipv4slb']['vs'] = 'renderVSGList';
+$tabhandler['ipv4slb']['lbs'] = 'renderLBList';
+$tabhandler['ipv4slb']['rspools'] = 'renderRSPoolList';
+$tabhandler['ipv4slb']['rservers'] = 'renderRealServerList';
 $tabhandler['ipv4slb']['defconfig'] = 'renderSLBDefConfig';
+$tabhandler['ipv4slb']['new_vs'] = 'renderNewVSForm';
+$tabhandler['ipv4slb']['new_vsg'] = 'renderNewVSGForm';
+$tabhandler['ipv4slb']['new_rs'] = 'renderNewRSPoolForm';
+$ophandler['ipv4slb']['new_vs']['add'] = 'addVService';
+$ophandler['ipv4slb']['new_vsg']['add'] = 'addVSG';
+$ophandler['ipv4slb']['new_rs']['add'] = 'addRSPool';
 $ophandler['ipv4slb']['defconfig']['save'] = 'updateSLBDefConfig';
 
-$page['ipv4vslist']['title'] = 'Virtual services';
-$page['ipv4vslist']['parent'] = 'ipv4slb';
-$tab['ipv4vslist']['default'] = 'View';
-$tab['ipv4vslist']['edit'] = 'Edit';
-$tabhandler['ipv4vslist']['default'] = 'renderVSList';
-$tabhandler['ipv4vslist']['edit'] = 'renderVSListEditForm';
-$ophandler['ipv4vslist']['edit']['add'] = 'addVService';
-$ophandler['ipv4vslist']['edit']['del'] = 'deleteVService';
-
-$page['ipv4vs']['parent'] = 'ipv4vslist';
+$page['ipv4vs']['parent'] = 'ipv4slb:default';
 $page['ipv4vs']['bypass'] = 'vs_id';
-$page['ipv4vs']['bypass_type'] = 'uint';
+$page['ipv4vs']['bypass_type'] = 'natural';
 $tab['ipv4vs']['default'] = 'View';
 $tab['ipv4vs']['edit'] = 'Edit';
-$tab['ipv4vs']['editlblist'] = 'Load balancers';
+$tab['ipv4vs']['editlblist'] = 'VS links';
 $tab['ipv4vs']['tags'] = 'Tags';
 $tab['ipv4vs']['files'] = 'Files';
 $tabhandler['ipv4vs']['default'] = 'renderVirtualService';
 $tabhandler['ipv4vs']['edit'] = 'renderEditVService';
-$tabhandler['ipv4vs']['editlblist'] = 'renderVServiceLBForm';
+$tabhandler['ipv4vs']['editlblist'] = 'renderSLBEditTab';
 $tabhandler['ipv4vs']['tags'] = 'renderEntityTags';
 $tabhandler['ipv4vs']['files'] = 'renderFilesForEntity';
 $trigger['ipv4vs']['tags'] = 'trigger_tags';
 $ophandler['ipv4vs']['edit']['updIPv4VS'] = 'updateVService';
+$ophandler['ipv4vs']['edit']['del'] = 'deleteVService';
 $ophandler['ipv4vs']['editlblist']['addLB'] = 'addLoadBalancer';
 $ophandler['ipv4vs']['editlblist']['delLB'] = 'tableHandler';
 $ophandler['ipv4vs']['editlblist']['updLB'] = 'tableHandler';
@@ -339,35 +427,62 @@ $ophandler['ipv4vs']['files']['addFile'] = 'addFileToEntity';
 $ophandler['ipv4vs']['files']['linkFile'] = 'linkFileToEntity';
 $ophandler['ipv4vs']['files']['unlinkFile'] = 'unlinkFile';
 
-$page['ipv4rsplist']['title'] = 'RS pools';
-$page['ipv4rsplist']['parent'] = 'ipv4slb';
-$tab['ipv4rsplist']['default'] = 'View';
-$tab['ipv4rsplist']['edit'] = 'Edit';
-$tabhandler['ipv4rsplist']['default'] = 'renderRSPoolList';
-$tabhandler['ipv4rsplist']['edit'] = 'editRSPools';
-$ophandler['ipv4rsplist']['edit']['add'] = 'addRSPool';
-$ophandler['ipv4rsplist']['edit']['del'] = 'deleteRSPool';
-
-$page['ipv4rspool']['parent'] = 'ipv4rsplist';
+$page['ipvs']['parent'] = 'ipv4slb:vs';
+$page['ipvs']['bypass'] = 'vs_id';
+$page['ipvs']['bypass_type'] = 'natural';
+$tab['ipvs']['default'] = 'View';
+$tab['ipvs']['edit'] = 'Edit';
+$tab['ipvs']['editvslinks'] = 'VSG links';
+$tab['ipvs']['tags'] = 'Tags';
+$tab['ipvs']['files'] = 'Files';
+$tab['ipvs']['convert'] = 'Migrate';
+$tabhandler['ipvs']['default'] = 'renderVS';
+$tabhandler['ipvs']['edit'] = 'renderEditVS';
+$tabhandler['ipvs']['editvslinks'] = 'renderTripletForm';
+$tabhandler['ipvs']['tags'] = 'renderEntityTags';
+$tabhandler['ipvs']['files'] = 'renderFilesForEntity';
+$tabhandler['ipvs']['convert'] = 'renderIPVSConvert';
+$ophandler['ipvs']['edit']['updVS'] = 'updateVS';
+$ophandler['ipvs']['edit']['del'] = 'deleteVS';
+$ophandler['ipvs']['edit']['addIP'] = 'addIPToVS';
+$ophandler['ipvs']['edit']['addPort'] = 'addPortToVS';
+$ophandler['ipvs']['edit']['updIP'] = 'updateIPInVS';
+$ophandler['ipvs']['edit']['updPort'] = 'updatePortInVS';
+$ophandler['ipvs']['edit']['delIP'] = 'removeIPFromVS';
+$ophandler['ipvs']['edit']['delPort'] = 'removePortFromVS';
+$ophandler['ipvs']['editvslinks']['addLink'] = 'createTriplet';
+$ophandler['ipvs']['editvslinks']['del'] = 'removeTriplet';
+$ophandler['ipvs']['editvslinks']['updPort'] = 'updateTripletConfig';
+$ophandler['ipvs']['editvslinks']['updIp'] = 'updateTripletConfig';
+$ophandler['ipvs']['tags']['saveTags'] = 'saveEntityTags';
+$ophandler['ipvs']['files']['addFile'] = 'addFileToEntity';
+$ophandler['ipvs']['files']['linkFile'] = 'linkFileToEntity';
+$ophandler['ipvs']['files']['unlinkFile'] = 'unlinkFile';
+$ophandler['ipvs']['convert']['convert'] = 'doVSMigrate';
+$trigger['ipvs']['tags'] = 'trigger_tags';
+$trigger['ipvs']['convert'] = 'trigger_ipvs_convert';
+
+$page['ipv4rspool']['parent'] = 'ipv4slb:rspools';
 $page['ipv4rspool']['bypass'] = 'pool_id';
-$page['ipv4rspool']['bypass_type'] = 'uint';
+$page['ipv4rspool']['bypass_type'] = 'natural';
 $tab['ipv4rspool']['default'] = 'View';
 $tab['ipv4rspool']['edit'] = 'Edit';
-$tab['ipv4rspool']['editlblist'] = 'Load balancers';
+$tab['ipv4rspool']['editlblist'] = 'VS links';
+$tab['ipv4rspool']['editvslinks'] = 'VSG links';
 $tab['ipv4rspool']['editrslist'] = 'RS list';
-$tab['ipv4rspool']['rsinservice'] = 'RS in service';
 $tab['ipv4rspool']['tags'] = 'Tags';
 $tab['ipv4rspool']['files'] = 'Files';
-$trigger['ipv4rspool']['rsinservice'] = 'trigger_poolrscount';
 $trigger['ipv4rspool']['tags'] = 'trigger_tags';
 $tabhandler['ipv4rspool']['default'] = 'renderRSPool';
 $tabhandler['ipv4rspool']['edit'] = 'renderEditRSPool';
 $tabhandler['ipv4rspool']['editrslist'] = 'renderRSPoolServerForm';
-$tabhandler['ipv4rspool']['editlblist'] = 'renderRSPoolLBForm';
-$tabhandler['ipv4rspool']['rsinservice'] = 'renderRSPoolRSInServiceForm';
+$tabhandler['ipv4rspool']['editvslinks'] = 'renderTripletForm';
+$tabhandler['ipv4rspool']['editlblist'] = 'renderSLBEditTab';
 $tabhandler['ipv4rspool']['tags'] = 'renderEntityTags';
 $tabhandler['ipv4rspool']['files'] = 'renderFilesForEntity';
-$ophandler['ipv4rspool']['edit']['updIPv4RSP'] = 'tableHandler';
+$ophandler['ipv4rspool']['edit']['updIPv4RSP'] = 'updIPv4RSP';
+$ophandler['ipv4rspool']['edit']['cloneIPv4RSP'] = 'cloneRSPool';
+$ophandler['ipv4rspool']['edit']['del'] = 'deleteRSPool';
 $ophandler['ipv4rspool']['editrslist']['addRS'] = 'addRealServer';
 $ophandler['ipv4rspool']['editrslist']['delRS'] = 'tableHandler';
 $ophandler['ipv4rspool']['editrslist']['updRS'] = 'updateRealServer';
@@ -375,20 +490,15 @@ $ophandler['ipv4rspool']['editrslist']['addMany'] = 'addRealServers';
 $ophandler['ipv4rspool']['editlblist']['addLB'] = 'addLoadBalancer';
 $ophandler['ipv4rspool']['editlblist']['delLB'] = 'tableHandler';
 $ophandler['ipv4rspool']['editlblist']['updLB'] = 'tableHandler';
-$ophandler['ipv4rspool']['rsinservice']['upd'] = 'updateRSInService';
+$ophandler['ipv4rspool']['editvslinks']['addLink'] = 'createTriplet';
+$ophandler['ipv4rspool']['editvslinks']['del'] = 'removeTriplet';
+$ophandler['ipv4rspool']['editvslinks']['updPort'] = 'updateTripletConfig';
+$ophandler['ipv4rspool']['editvslinks']['updIp'] = 'updateTripletConfig';
 $ophandler['ipv4rspool']['tags']['saveTags'] = 'saveEntityTags';
 $ophandler['ipv4rspool']['files']['addFile'] = 'addFileToEntity';
 $ophandler['ipv4rspool']['files']['linkFile'] = 'linkFileToEntity';
 $ophandler['ipv4rspool']['files']['unlinkFile'] = 'unlinkFile';
 
-$page['rservers']['title'] = 'Real servers';
-$page['rservers']['parent'] = 'ipv4slb';
-$page['rservers']['handler'] = 'renderRealServerList';
-
-$page['lbs']['title'] = 'Load balancers';
-$page['lbs']['parent'] = 'ipv4slb';
-$page['lbs']['handler'] = 'renderLBList';
-
 $page['search']['handler'] = 'searchHandler';
 $page['search']['parent'] = 'index';
 $page['search']['bypass'] = 'q';
@@ -396,6 +506,7 @@ $page['search']['bypass'] = 'q';
 $page['config']['title'] = 'Configuration';
 $page['config']['handler'] = 'renderConfigMainpage';
 $page['config']['parent'] = 'index';
+$interface_requires['config-*'] = 'interface-config.php';
 
 $page['userlist']['title'] = 'Local users';
 $page['userlist']['parent'] = 'config';
@@ -405,20 +516,26 @@ $tabhandler['userlist']['default'] = 'renderUserList';
 $tabhandler['userlist']['edit'] = 'renderUserListEditor';
 $ophandler['userlist']['edit']['updateUser'] = 'updateUser';
 $ophandler['userlist']['edit']['createUser'] = 'createUser';
+$ophandler['userlist']['edit']['deleteUser'] = 'deleteUser';
+$interface_requires['userlist-*'] = 'interface-config.php';
 
 $page['user']['parent'] = 'userlist';
 $page['user']['bypass'] = 'user_id';
-$page['user']['bypass_type'] = 'uint';
+$page['user']['bypass_type'] = 'natural';
 $tab['user']['default'] = 'View';
+$tab['user']['properties'] = 'Properties';
 $tab['user']['tags'] = 'Tags';
 $tab['user']['files'] = 'Files';
 $tabhandler['user']['default'] = 'renderUser';
 $tabhandler['user']['tags'] = 'renderEntityTags';
 $tabhandler['user']['files'] = 'renderFilesForEntity';
+$tabhandler['user']['properties'] = 'renderUserProperties';
+$ophandler['user']['properties']['edit'] = 'editUserProperties';
 $ophandler['user']['tags']['saveTags'] = 'saveEntityTags';
 $ophandler['user']['files']['addFile'] = 'addFileToEntity';
 $ophandler['user']['files']['linkFile'] = 'linkFileToEntity';
 $ophandler['user']['files']['unlinkFile'] = 'unlinkFile';
+$interface_requires['user-*'] = 'interface-config.php';
 
 $page['perms']['title'] = 'Permissions';
 $page['perms']['parent'] = 'config';
@@ -427,6 +544,7 @@ $tab['perms']['edit'] = 'Edit';
 $tabhandler['perms']['default'] = 'renderRackCodeViewer';
 $tabhandler['perms']['edit'] = 'renderRackCodeEditor';
 $ophandler['perms']['edit']['saveRackCode'] = 'saveRackCode';
+$interface_requires['perms-*'] = 'interface-config.php';
 
 $page['parentmap']['title'] = 'Object container compatibility';
 $page['parentmap']['parent'] = 'config';
@@ -436,26 +554,42 @@ $tabhandler['parentmap']['default'] = 'renderObjectParentCompatViewer';
 $tabhandler['parentmap']['edit'] = 'renderObjectParentCompatEditor';
 $ophandler['parentmap']['edit']['add'] = 'tableHandler';
 $ophandler['parentmap']['edit']['del'] = 'tableHandler';
+$interface_requires['parentmap-*'] = 'interface-config.php';
 
 $page['portmap']['title'] = 'Port compatibility';
 $page['portmap']['parent'] = 'config';
 $tab['portmap']['default'] = 'View';
 $tab['portmap']['edit'] = 'Edit';
-$tabhandler['portmap']['default'] = 'renderPortOIFCompatViewer';
-$tabhandler['portmap']['edit'] = 'renderPortOIFCompatEditor';
-$ophandler['portmap']['edit']['add'] = 'tableHandler';
-$ophandler['portmap']['edit']['del'] = 'tableHandler';
+$tabhandler['portmap']['default'] = 'renderOIFCompatViewer';
+$tabhandler['portmap']['edit'] = 'renderOIFCompatEditor';
+$ophandler['portmap']['edit']['add'] = 'addOIFCompat';
+$ophandler['portmap']['edit']['del'] = 'delOIFCompat';
+$ophandler['portmap']['edit']['addPack'] = 'addOIFCompatPack';
+$ophandler['portmap']['edit']['delPack'] = 'delOIFCompatPack';
+$interface_requires['portmap-*'] = 'interface-config.php';
 
 $page['portifcompat']['title'] = 'Enabled port types';
 $page['portifcompat']['parent'] = 'config';
 $tab['portifcompat']['default'] = 'View';
 $tab['portifcompat']['edit'] = 'Edit';
-$tabhandler['portifcompat']['default'] = 'renderPortIFCompat';
-$tabhandler['portifcompat']['edit'] = 'renderPortIFCompatEditor';
-$ophandler['portifcompat']['edit']['add'] = 'addPortInterfaceCompat';
+$tabhandler['portifcompat']['default'] = 'renderIIFOIFCompat';
+$tabhandler['portifcompat']['edit'] = 'renderIIFOIFCompatEditor';
+$ophandler['portifcompat']['edit']['add'] = 'tableHandler';
 $ophandler['portifcompat']['edit']['del'] = 'tableHandler';
-$ophandler['portifcompat']['edit']['addPack'] = 'addPortInterfaceCompatPack';
-$ophandler['portifcompat']['edit']['delPack'] = 'delPortInterfaceCompatPack';
+$ophandler['portifcompat']['edit']['addPack'] = 'addIIFOIFCompatPack';
+$ophandler['portifcompat']['edit']['delPack'] = 'delIIFOIFCompatPack';
+$interface_requires['portifcompat-*'] = 'interface-config.php';
+
+$page['portoifs']['title'] = 'Port outer interfaces';
+$page['portoifs']['parent'] = 'config';
+$tab['portoifs']['default'] = 'View';
+$tab['portoifs']['edit'] = 'Edit';
+$tabhandler['portoifs']['default'] = 'renderPortOIFViewer';
+$tabhandler['portoifs']['edit'] = 'renderPortOIFEditor';
+$ophandler['portoifs']['edit']['add'] = 'tableHandler';
+$ophandler['portoifs']['edit']['del'] = 'tableHandler';
+$ophandler['portoifs']['edit']['upd'] = 'tableHandler';
+$interface_requires['portoifs-*'] = 'interface-config.php';
 
 $page['attrs']['title'] = 'Attributes';
 $page['attrs']['parent'] = 'config';
@@ -470,6 +604,7 @@ $ophandler['attrs']['editattrs']['del'] = 'tableHandler';
 $ophandler['attrs']['editattrs']['upd'] = 'tableHandler';
 $ophandler['attrs']['editmap']['add'] = 'supplementAttrMap';
 $ophandler['attrs']['editmap']['del'] = 'tableHandler';
+$interface_requires['attrs-*'] = 'interface-config.php';
 
 $page['dict']['title'] = 'Dictionary';
 $page['dict']['parent'] = 'config';
@@ -478,19 +613,21 @@ $tab['dict']['chapters'] = 'Manage chapters';
 $tabhandler['dict']['default'] = 'renderDictionary';
 $tabhandler['dict']['chapters'] = 'renderChaptersEditor';
 $ophandler['dict']['chapters']['add'] = 'tableHandler';
-$ophandler['dict']['chapters']['del'] = 'delChapter';
-$ophandler['dict']['chapters']['upd'] = 'updateChapter';
+$ophandler['dict']['chapters']['del'] = 'tableHandler';
+$ophandler['dict']['chapters']['upd'] = 'tableHandler';
+$interface_requires['dict-*'] = 'interface-config.php';
 
 $page['chapter']['parent'] = 'dict';
 $page['chapter']['bypass'] = 'chapter_no';
-$page['chapter']['bypass_type'] = 'uint';
+$page['chapter']['bypass_type'] = 'natural';
 $tab['chapter']['default'] = 'View';
 $tab['chapter']['edit'] = 'Edit';
 $tabhandler['chapter']['default'] = 'renderChapter';
 $tabhandler['chapter']['edit'] = 'renderChapterEditor';
 $ophandler['chapter']['edit']['add'] = 'tableHandler';
 $ophandler['chapter']['edit']['del'] = 'tableHandler';
-$ophandler['chapter']['edit']['upd'] = 'updateDictionary';
+$ophandler['chapter']['edit']['upd'] = 'tableHandler';
+$interface_requires['chapter-*'] = 'interface-config.php';
 
 $page['ui']['title'] = 'User interface';
 $page['ui']['parent'] = 'config';
@@ -498,51 +635,87 @@ $tab['ui']['default'] = 'View';
 $tab['ui']['edit'] = 'Change';
 $tab['ui']['reset'] = 'Reset';
 $tabhandler['ui']['default'] = 'renderUIConfig';
-$tabhandler['ui']['edit'] = 'renderUIConfigEditForm';
+$tabhandler['ui']['edit'] = 'renderConfigEditor';
 $tabhandler['ui']['reset'] = 'renderUIResetForm';
 $ophandler['ui']['edit']['upd'] = 'updateUI';
-$ophandler['ui']['reset']['go'] = 'resetUIConfig';
+$ophandler['ui']['reset']['resetUIConfig'] = 'resetUIConfig';
+$interface_requires['ui-*'] = 'interface-config.php';
 
 $page['tagtree']['title'] = 'Tag tree';
 $page['tagtree']['parent'] = 'config';
 $tab['tagtree']['default'] = 'View';
-$tab['tagtree']['edit'] = 'Edit';
+$tab['tagtree']['edit'] = 'Edit tree';
+$tab['tagtree']['descriptions'] = 'Edit descriptions';
+$tab['tagtree']['resolve'] = 'Circular references';
 $tabhandler['tagtree']['default'] = 'renderTagTree';
 $tabhandler['tagtree']['edit'] = 'renderTagTreeEditor';
+$tabhandler['tagtree']['descriptions'] = 'renderTagDescriptionsEditor';
+$tabhandler['tagtree']['resolve'] = 'renderGraphCycleResolver';
 $ophandler['tagtree']['edit']['createTag'] = 'tableHandler';
 $ophandler['tagtree']['edit']['destroyTag'] = 'tableHandler';
-$ophandler['tagtree']['edit']['updateTag'] = 'tableHandler';
+$ophandler['tagtree']['edit']['updateTag'] = 'updateTag';
+$ophandler['tagtree']['descriptions']['updTagDescr'] = 'tableHandler';
+$ophandler['tagtree']['resolve']['updateTag'] = 'updateTag';
+$trigger['tagtree']['resolve'] = 'triggerGraphCycleResolver';
+$interface_requires['tagtree-*'] = 'interface-config.php';
 
 $page['myaccount']['title'] = 'My account';
 $page['myaccount']['parent'] = 'config';
 $tab['myaccount']['default'] = 'Info';
 $tab['myaccount']['mypassword'] = 'Password change';
 $tab['myaccount']['interface'] = 'Interface preferences';
+$tab['myaccount']['qlinks'] = 'Quick links';
 $trigger['myaccount']['mypassword'] = 'trigger_passwdchange';
 $tabhandler['myaccount']['default'] = 'renderMyAccount';
 $tabhandler['myaccount']['mypassword'] = 'renderMyPasswordEditor';
-$tabhandler['myaccount']['interface'] = 'renderMyPreferences';
+$tabhandler['myaccount']['interface'] = 'renderConfigEditor';
+$tabhandler['myaccount']['qlinks'] = 'renderMyQuickLinks';
 $ophandler['myaccount']['mypassword']['changeMyPassword'] = 'changeMyPassword';
 $ophandler['myaccount']['interface']['upd'] = 'saveMyPreferences';
 $ophandler['myaccount']['interface']['reset'] = 'resetMyPreference';
+$ophandler['myaccount']['qlinks']['save'] = 'saveQuickLinks';
+$interface_requires['myaccount-*'] = 'interface-config.php';
+
+$page['cableconf']['title'] = 'Patch cables';
+$page['cableconf']['parent'] = 'config';
+$tab['cableconf']['default'] = 'View';
+$tab['cableconf']['connectors'] = 'Edit connectors';
+$tab['cableconf']['cabletypes'] = 'Edit cable types';
+$tab['cableconf']['conncompat'] = 'Connector compatibility';
+$tab['cableconf']['oifcompat'] = 'Outer interface compatibility';
+$tabhandler['cableconf']['default'] = 'renderPatchCableConfiguration';
+$tabhandler['cableconf']['connectors'] = 'renderPatchCableConnectorEditor';
+$tabhandler['cableconf']['cabletypes'] = 'renderPatchCableTypeEditor';
+$tabhandler['cableconf']['conncompat'] = 'renderPatchCableConnectorCompatEditor';
+$tabhandler['cableconf']['oifcompat'] = 'renderPatchCableOIFCompatEditor';
+$ophandler['cableconf']['connectors']['add'] = 'tableHandler';
+$ophandler['cableconf']['connectors']['del'] = 'tableHandler';
+$ophandler['cableconf']['connectors']['upd'] = 'tableHandler';
+$ophandler['cableconf']['cabletypes']['add'] = 'tableHandler';
+$ophandler['cableconf']['cabletypes']['del'] = 'tableHandler';
+$ophandler['cableconf']['cabletypes']['upd'] = 'tableHandler';
+$ophandler['cableconf']['conncompat']['add'] = 'tableHandler';
+$ophandler['cableconf']['conncompat']['del'] = 'tableHandler';
+$ophandler['cableconf']['oifcompat']['add'] = 'tableHandler';
+$ophandler['cableconf']['oifcompat']['del'] = 'tableHandler';
+$interface_requires['cableconf-*'] = 'interface-cables.php';
 
 $page['reports']['title'] = 'Reports';
 $page['reports']['parent'] = 'index';
-$tab['reports']['default'] = 'System';
-$tab['reports']['rackcode'] = 'RackCode';
-$tab['reports']['ipv4'] = 'IPv4';
-$tab['reports']['ipv6'] = 'IPv6';
-$tab['reports']['ports'] = 'Ports';
+$tab['reports']['default'] = 'Totals';
 $tab['reports']['8021q'] = '802.1Q';
-$tab['reports']['local'] = 'local'; // this one is set later in init.php
-$trigger['reports']['local'] = 'trigger_localreports';
+$tab['reports']['warranty'] = 'Expirations';
+$tab['reports']['integrity'] = 'Data Integrity';
+$tab['reports']['serverconf'] = 'Server configuration';
 $tabhandler['reports']['default'] = 'renderSystemReports';
-$tabhandler['reports']['rackcode'] = 'renderRackCodeReports';
-$tabhandler['reports']['ipv4'] = 'renderIPv4Reports';
-$tabhandler['reports']['ipv6'] = 'renderIPv6Reports';
-$tabhandler['reports']['ports'] = 'renderPortsReport';
 $tabhandler['reports']['8021q'] = 'render8021QReport';
-$tabhandler['reports']['local'] = 'renderLocalReports';
+$tabhandler['reports']['warranty'] = 'renderExpirations';
+$tabhandler['reports']['integrity'] = 'renderDataIntegrityReport';
+$tabhandler['reports']['serverconf'] = 'renderServerConfigurationReport';
+$interface_requires['reports-default'] = 'code.php';
+$interface_requires['reports-serverconf'] = 'dictionary.php';
+$interface_requires['reports-integrity'] = 'dictionary.php';
+$interface_requires['reports-*'] = 'interface-reports.php';
 
 $page['files']['title'] = 'Files';
 $page['files']['parent'] = 'index';
@@ -555,7 +728,7 @@ $ophandler['files']['manage']['unlinkFile'] = 'unlinkFile';
 $ophandler['files']['manage']['deleteFile'] = 'deleteFile';
 
 $page['file']['bypass'] = 'file_id';
-$page['file']['bypass_type'] = 'uint';
+$page['file']['bypass_type'] = 'natural';
 $page['file']['parent'] = 'files';
 $tab['file']['default'] = 'View';
 $tab['file']['edit'] = 'Properties';
@@ -571,7 +744,7 @@ $tabhandler['file']['tags'] = 'renderEntityTags';
 $tabhandler['file']['editText'] = 'renderTextEditor';
 $tabhandler['file']['replaceData'] = 'renderFileReuploader';
 $tabhandler['file']['download'] = 'renderFileDownloader';
-$ophandler['file']['edit']['updateFile'] = 'tableHandler';
+$ophandler['file']['edit']['updateFile'] = 'updateFile';
 $ophandler['file']['tags']['saveTags'] = 'saveEntityTags';
 $ophandler['file']['editText']['updateFileText'] = 'updateFileText';
 $ophandler['file']['replaceData']['replaceFile'] = 'replaceFile';
@@ -585,15 +758,16 @@ $tabhandler['8021q']['default'] = 'render8021QStatus';
 $tabhandler['8021q']['vdlist'] = 'renderVLANDomainListEditor';
 $tabhandler['8021q']['vstlist'] = 'renderVSTListEditor';
 $ophandler['8021q']['vdlist']['add'] = 'createVLANDomain';
-$ophandler['8021q']['vdlist']['del'] = 'destroyVLANDomain';
-$ophandler['8021q']['vdlist']['upd'] = 'tableHandler';
-$ophandler['8021q']['vstlist']['add'] = 'addVLANSwitchTemplate';
-$ophandler['8021q']['vstlist']['del'] = 'delVLANSwitchTemplate';
+$ophandler['8021q']['vdlist']['del'] = 'tableHandler';
+$ophandler['8021q']['vdlist']['upd'] = 'updateVLANDomain';
+$ophandler['8021q']['vstlist']['add'] = 'tableHandler';
+$ophandler['8021q']['vstlist']['del'] = 'tableHandler';
 $ophandler['8021q']['vstlist']['upd'] = 'tableHandler';
+$interface_requires['8021q-*'] = 'interface-8021q.php';
 
 $page['vlandomain']['parent'] = '8021q';
 $page['vlandomain']['bypass'] = 'vdom_id';
-$page['vlandomain']['bypass_type'] = 'uint';
+$page['vlandomain']['bypass_type'] = 'natural';
 $tab['vlandomain']['default'] = 'View';
 $tab['vlandomain']['vlanlist'] = 'VLAN list';
 $tab['vlandomain']['8021qorder'] = '802.1Q orders';
@@ -606,44 +780,61 @@ $ophandler['vlandomain']['8021qorder']['del'] = 'del8021QOrder';
 $ophandler['vlandomain']['vlanlist']['add'] = 'tableHandler';
 $ophandler['vlandomain']['vlanlist']['del'] = 'tableHandler';
 $ophandler['vlandomain']['vlanlist']['upd'] = 'tableHandler';
+$delayauth['vlandomain-8021qorder-add'] = TRUE;
+$delayauth['vlandomain-8021qorder-del'] = TRUE;
+$interface_requires['vlandomain-*'] = 'interface-8021q.php';
 
 $page['vlan']['parent'] = 'vlandomain';
 $page['vlan']['bypass'] = 'vlan_ck';
-$page['vlan']['bypass_type'] = 'string';
+$page['vlan']['bypass_type'] = 'uint-vlan1';
 $tab['vlan']['default'] = 'View';
+$tab['vlan']['edit'] = 'Edit';
 $tab['vlan']['ipv4'] = 'IPv4';
 $tab['vlan']['ipv6'] = 'IPv6';
 $trigger['vlan']['ipv4'] = 'trigger_vlan_ipv4net';
 $trigger['vlan']['ipv6'] = 'trigger_vlan_ipv6net';
 $tabhandler['vlan']['default'] = 'renderVLANInfo';
+$tabhandler['vlan']['edit'] = 'renderEditVlan';
 $tabhandler['vlan']['ipv4'] = 'renderVLANIPLinks';
 $tabhandler['vlan']['ipv6'] = 'renderVLANIPLinks';
+$ophandler['vlan']['edit']['del'] = 'deleteVlan';
+$ophandler['vlan']['edit']['clear'] = 'clearVlan';
+$ophandler['vlan']['edit']['upd'] = 'tableHandler';
 $ophandler['vlan']['ipv4']['bind'] = 'bindVLANtoIPv4';
 $ophandler['vlan']['ipv4']['unbind'] = 'unbindVLANfromIPv4';
 $ophandler['vlan']['ipv6']['bind'] = 'bindVLANtoIPv6';
 $ophandler['vlan']['ipv6']['unbind'] = 'unbindVLANfromIPv6';
+$interface_requires['vlan-*'] = 'interface-8021q.php';
 
 $page['vst']['parent'] = '8021q';
 $page['vst']['bypass'] = 'vst_id';
-$page['vst']['bypass_type'] = 'uint';
+$page['vst']['bypass_type'] = 'natural';
 $tab['vst']['default'] = 'View';
 $tab['vst']['editrules'] = 'Edit';
 $tab['vst']['8021qorder'] = '802.1Q orders';
+$tab['vst']['tags'] = 'Tags';
 $trigger['vst']['editrules'] = 'trigger_vst_editrules';
 $trigger['vst']['8021qorder'] = 'trigger_8021q_configured';
+$trigger['vst']['tags'] = 'trigger_tags';
 $tabhandler['vst']['default'] = 'renderVST';
 $tabhandler['vst']['editrules'] = 'renderVSTRulesEditor';
 $tabhandler['vst']['8021qorder'] = 'render8021QOrderForm';
+$tabhandler['vst']['tags'] = 'renderEntityTags';
 $ophandler['vst']['editrules']['clone'] = 'cloneVST';
 $ophandler['vst']['editrules']['upd'] = 'updVSTRule';
 $ophandler['vst']['8021qorder']['add'] = 'add8021QOrder';
 $ophandler['vst']['8021qorder']['del'] = 'del8021QOrder';
+$ophandler['vst']['tags']['saveTags'] = 'saveEntityTags';
+$delayauth['vst-8021qorder-add'] = TRUE;
+$delayauth['vst-8021qorder-del'] = TRUE;
+$interface_requires['vst-*'] = 'interface-8021q.php';
 
 $page['dqueue']['parent'] = '8021q';
 $page['dqueue']['bypass'] = 'dqcode';
 $page['dqueue']['bypass_type'] = 'enum/dqcode';
 $tab['dqueue']['default'] = 'View';
 $tabhandler['dqueue']['default'] = 'renderDeployQueue';
+$interface_requires['dqueue-*'] = 'interface-8021q.php';
 
 $page['objectlog']['title'] = 'Log records';
 $page['objectlog']['parent'] = 'index';
@@ -655,4 +846,53 @@ $page['virtual']['parent'] = 'index';
 $tab['virtual']['default'] = 'Summary';
 $tabhandler['virtual']['default'] = 'renderVirtualResourcesSummary';
 
-?>
+$page['cables']['title'] = 'Patch cables';
+$page['cables']['parent'] = 'index';
+$tab['cables']['default'] = 'View';
+$tab['cables']['amount'] = 'Consume/replenish';
+$tab['cables']['heaps'] = 'Configure heaps';
+$trigger['cables']['amount'] = 'triggerPatchCableHeapsConfigured';
+$tabhandler['cables']['default'] = 'renderPatchCableHeapSummary';
+$tabhandler['cables']['amount'] = 'renderPatchCableHeapAmount';
+$tabhandler['cables']['heaps'] = 'renderPatchCableHeapEditor';
+$ophandler['cables']['heaps']['add'] = 'tableHandler';
+$ophandler['cables']['heaps']['del'] = 'tableHandler';
+$ophandler['cables']['heaps']['upd'] = 'tableHandler';
+$ophandler['cables']['amount']['dec'] = 'consumePatchCable';
+$ophandler['cables']['amount']['inc'] = 'replenishPatchCable';
+$ophandler['cables']['amount']['set'] = 'setPatchCableAmount';
+$interface_requires['cables-*'] = 'interface-cables.php';
+
+$page['plugins']['title'] = 'Plugins';
+$page['plugins']['parent'] = 'config';
+$tab['plugins']['default'] = 'View';
+$tab['plugins']['edit'] = 'Edit';
+$tabhandler['plugins']['default'] = 'renderPluginConfig';
+$tabhandler['plugins']['edit'] = 'renderPluginEditor';
+$ophandler['plugins']['edit']['install'] = 'installPlugin';
+$ophandler['plugins']['edit']['uninstall'] = 'uninstallPlugin';
+$ophandler['plugins']['edit']['enable'] = 'tableHandler';
+$ophandler['plugins']['edit']['disable'] = 'tableHandler';
+$ophandler['plugins']['edit']['upgrade'] = 'upgradePlugin';
+$interface_requires['plugins-*'] = 'interface-config.php';
+
+$ajaxhandler['get-parent-node-options'] = 'getParentNodeOptionsAJAX';
+$ajaxhandler['get-location-select'] = 'getLocationSelectAJAX';
+$ajaxhandler['verifyCode'] = 'verifyCodeAJAX';
+$ajaxhandler['get-port-link'] = 'getPortInfoAJAX';
+$ajaxhandler['get-port-mac'] = 'getPortInfoAJAX';
+$ajaxhandler['get-port-portmac'] = 'getPortInfoAJAX';
+$ajaxhandler['get-port-conf'] = 'getPortInfoAJAX';
+$ajaxhandler['upd-ip-name'] = 'updateIPNameAJAX';
+$ajaxhandler['upd-ip-comment'] = 'updateIPCommentAJAX';
+$ajaxhandler['upd-rack-sort-order'] = 'updateRackSortOrderAJAX';
+$ajaxhandler['upd-reservation-port'] = 'updatePortRsvAJAX';
+$ajaxhandler['upd-reservation-cable'] = 'updateCableIdAJAX';
+$ajaxhandler['net-usage'] = 'getNetUsageAJAX';
+$ajaxhandler['get-slb-form'] = 'renderSLBFormAJAX';
+$ajaxhandler['triplet-preview'] = 'getTripletConfigAJAX';
+$ajaxhandler['autocomplete'] = 'getAutocompleteListAJAX';
+
+$popuphandler['objlist'] = 'renderPopupObjectSelector';
+$popuphandler['portlist'] = 'renderPopupPortSelector';
+$popuphandler['inet4list'] = 'renderPopupIPv4Selector';