diff --git a/meshuser.js b/meshuser.js
index e8545cdc..e0d4b624 100644
--- a/meshuser.js
+++ b/meshuser.js
@@ -4093,39 +4093,46 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
             case 'uploadagentcore':
                 {
                     if (common.validateString(command.type, 1, 40) == false) break; // Check path
+                    if (common.validateArray(command.nodeids, 1) == false) break; // Check nodeid's
 
-                    // Get the node and the rights for this node
-                    parent.GetNodeWithRights(domain, user, command.nodeid, function (node, rights, visible) {
-                        if ((node == null) || (((rights & MESHRIGHT_AGENTCONSOLE) == 0) && (user.siteadmin != SITERIGHT_ADMIN))) return;
+                    // Go thru all node identifiers and run the operation
+                    for (var i in command.nodeids) {
+                        var nodeid = command.nodeids[i];
+                        if (typeof nodeid != 'string') return;
 
-                        // TODO: If we have peer servers, inform...
-                        //if (parent.parent.multiServer != null) { parent.parent.multiServer.DispatchMessage({ action: 'uploadagentcore', sessionid: ws.sessionId }); }
+                        // Get the node and the rights for this node
+                        parent.GetNodeWithRights(domain, user, nodeid, function (node, rights, visible) {
+                            if ((node == null) || (((rights & MESHRIGHT_AGENTCONSOLE) == 0) && (user.siteadmin != SITERIGHT_ADMIN))) return;
 
-                        if (command.type == 'default') {
-                            // Send the default core to the agent
-                            parent.parent.updateMeshCore(function () { parent.sendMeshAgentCore(user, domain, node._id, 'default'); });
-                        } else if (command.type == 'clear') {
-                            // Clear the mesh agent core on the mesh agent
-                            parent.sendMeshAgentCore(user, domain, node._id, 'clear');
-                        } else if (command.type == 'recovery') {
-                            // Send the recovery core to the agent
-                            parent.sendMeshAgentCore(user, domain, node._id, 'recovery');
-                        } else if (command.type == 'tiny') {
-                            // Send the tiny core to the agent
-                            parent.sendMeshAgentCore(user, domain, node._id, 'tiny');
-                        } else if ((command.type == 'custom') && (common.validateString(command.path, 1, 2048) == true)) {
-                            // Send a mesh agent core to the mesh agent
-                            var file = parent.getServerFilePath(user, domain, command.path);
-                            if (file != null) {
-                                fs.readFile(file.fullpath, 'utf8', function (err, data) {
-                                    if (err != null) {
-                                        data = common.IntToStr(0) + data; // Add the 4 bytes encoding type & flags (Set to 0 for raw)
-                                        parent.sendMeshAgentCore(user, domain, node._id, 'custom', data);
-                                    }
-                                });
+                            // TODO: If we have peer servers, inform...
+                            //if (parent.parent.multiServer != null) { parent.parent.multiServer.DispatchMessage({ action: 'uploadagentcore', sessionid: ws.sessionId }); }
+
+                            if (command.type == 'default') {
+                                // Send the default core to the agent
+                                parent.parent.updateMeshCore(function () { parent.sendMeshAgentCore(user, domain, node._id, 'default'); });
+                            } else if (command.type == 'clear') {
+                                // Clear the mesh agent core on the mesh agent
+                                parent.sendMeshAgentCore(user, domain, node._id, 'clear');
+                            } else if (command.type == 'recovery') {
+                                // Send the recovery core to the agent
+                                parent.sendMeshAgentCore(user, domain, node._id, 'recovery');
+                            } else if (command.type == 'tiny') {
+                                // Send the tiny core to the agent
+                                parent.sendMeshAgentCore(user, domain, node._id, 'tiny');
+                            } else if ((command.type == 'custom') && (common.validateString(command.path, 1, 2048) == true)) {
+                                // Send a mesh agent core to the mesh agent
+                                var file = parent.getServerFilePath(user, domain, command.path);
+                                if (file != null) {
+                                    fs.readFile(file.fullpath, 'utf8', function (err, data) {
+                                        if (err != null) {
+                                            data = common.IntToStr(0) + data; // Add the 4 bytes encoding type & flags (Set to 0 for raw)
+                                            parent.sendMeshAgentCore(user, domain, node._id, 'custom', data);
+                                        }
+                                    });
+                                }
                             }
-                        }
-                    });
+                        });
+                    }
                     break;
                 }
             case 'agentdisconnect':
diff --git a/views/default.handlebars b/views/default.handlebars
index 235454c9..be36b713 100644
--- a/views/default.handlebars
+++ b/views/default.handlebars
@@ -4652,7 +4652,12 @@
                 if ((rights & 4) && ((added & 64) == 0)) { added |= 64; addedOptions += ''; }
                 if ((rights & 8) && ((added & 256) == 0)) { added |= 256; addedOptions += ''; }
                 if ((rights & 32768) && ((added & 128) == 0)) { added |= 128; addedOptions += ''; }
-                if ((node.agent != null) && (features2 & 0x00000010) && (rights == 0xFFFFFFFF) && ((added & 512) == 0)) { added |= 512; addedOptions += ''; }
+                if ((node.agent != null) && (features2 & 0x00000010) && (rights == 0xFFFFFFFF) && ((added & 512) == 0)) {
+                    added |= 512;
+                    addedOptions += '';
+                    addedOptions += '';
+                    addedOptions += '';
+                }
             }
 
             var x = "Select an operation to perform on all selected devices. Actions will be performed only with proper rights." + '
';
@@ -4745,7 +4750,15 @@
             } else if (op == 110) {
                 // Force agent update
                 var x = "Force agent update on selected devices?" + '
';
-                setDialogMode(2, "Edit Device Tags", 3, d2groupActionFunctionAgentUpdateExec, x);
+                setDialogMode(2, "For agent update", 3, d2groupActionFunctionAgentUpdateExec, x);
+            } else if (op == 111) {
+                // Clear agent core
+                var x = "Clear agent core on selected devices?" + '
';
+                setDialogMode(2, "Clear agent core", 3, d2groupActionFunctionAgentClearCoreExec, x);
+            } else if (op == 112) {
+                // Upload default server core
+                var x = "Upload default server core on selected devices?" + '
';
+                setDialogMode(2, "Upload default server core", 3, d2groupActionFunctionAgentDefaultCodeExec, x);
             } else {
                 // Power operation
                 meshserver.send({ action: 'poweraction', nodeids: getCheckedDevices(), actiontype: parseInt(op) });
@@ -4756,6 +4769,8 @@
         function d2batchUploadValidate() { QE('idx_dlgOkButton', (Q('d2uploadinput').files.length != 0) && ((Q('d2winuploadpath') == null) || (Q('d2winuploadpath').value != '')) && ((Q('d2linuxuploadpath') == null) || (Q('d2linuxuploadpath').value != ''))); }
         function d2batchUploadValidateOk() { Q('d2batchUploadSubmit').click(); }
         function d2groupActionFunctionAgentUpdateExec() { meshserver.send({ action: 'updateAgents', nodeids: getCheckedDevices() }); }
+        function d2groupActionFunctionAgentClearCoreExec() { meshserver.send({ action: 'uploadagentcore', nodeids: getCheckedDevices(), type: 'clear' }); }
+        function d2groupActionFunctionAgentDefaultCodeExec() { meshserver.send({ action: 'uploadagentcore', nodeids: getCheckedDevices(), type: 'default' }); }
 
         function d2groupActionFunctionNotifyExec() {
             var op = Q('d2deviceop').value, title = Q('dp2notifyTitle').value, msg = Q('d2notifyMsg').value, chkNodeIds = getCheckedDevices();
@@ -9583,8 +9598,8 @@
         // Called then user presses the "Change Core" button
         function p15uploadCore(e) {
             if (xxdialogMode) return;
-            if (e.shiftKey == true) { meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id, type: 'default' }); } // Upload default core
-            else if (e.altKey == true) { meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id, type: 'clear' }); } // Clear the core
+            if (e.shiftKey == true) { meshserver.send({ action: 'uploadagentcore', nodeids: [ consoleNode._id ], type: 'default' }); } // Upload default core
+            else if (e.altKey == true) { meshserver.send({ action: 'uploadagentcore', nodeids: [ consoleNode._id ], type: 'clear' }); } // Clear the core
             else if (e.ctrlKey == true) { p15uploadCore2(); } // Upload the core from a file
             else { setDialogMode(2, "Perform Agent Action", 3, p15uploadCoreEx, addHtmlValue("Action", '')); }
         }
@@ -9592,10 +9607,10 @@
         function p15uploadCoreEx() {
             if (Q('d3coreMode').value == 1) {
                 // Upload default core
-                meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id, type: 'default' });
+                meshserver.send({ action: 'uploadagentcore', nodeids: [ consoleNode._id ], type: 'default' });
             } else if (Q('d3coreMode').value == 2) {
                 // Clear the core
-                meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id, type: 'clear' });
+                meshserver.send({ action: 'uploadagentcore', nodeids: [ consoleNode._id ], type: 'clear' });
             } else if (Q('d3coreMode').value == 3) {
                 // Upload file as core
                 p15uploadCore2();
@@ -9607,10 +9622,10 @@
                 meshserver.send({ action: 'agentdisconnect', nodeid: consoleNode._id, disconnectMode: 2 });
             } else if (Q('d3coreMode').value == 6) {
                 // Upload a recovery core
-                meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id, type:'recovery' });
+                meshserver.send({ action: 'uploadagentcore', nodeids: [ consoleNode._id ], type:'recovery' });
             } else if (Q('d3coreMode').value == 7) {
                 // Upload a tiny core
-                meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id, type:'tiny' });
+                meshserver.send({ action: 'uploadagentcore', nodeids: [ consoleNode._id ], type:'tiny' });
             }
         }
 
@@ -9632,7 +9647,7 @@
             } else {
                 // Upload server mesh agent code
                 var files = d3getFileSel();
-                if (files.length == 1) { meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id, type: 'custom', path: d3filetreelocation.join('/') + '/' + files[0] }); }
+                if (files.length == 1) { meshserver.send({ action: 'uploadagentcore', nodeids: [ consoleNode._id ], type: 'custom', path: d3filetreelocation.join('/') + '/' + files[0] }); }
             }
         }