diff --git a/webgui/ajax.php b/webgui/ajax.php
index 8b94870b7f3776f1b81087c1ef4b3c24a6665d7f..47d5e38296bdf7f9c67311fb9d86f29178149ad9 100644
--- a/webgui/ajax.php
+++ b/webgui/ajax.php
@@ -12,7 +12,10 @@
 	include_once("include/ajax/functions/AdminGroupMembers.php");
 
 	include_once("include/ajax/functions/AdminRealms.php");
+	include_once("include/ajax/functions/AdminRealmAttributes.php");
+
 	include_once("include/ajax/functions/WiSPLocations.php");
+	include_once("include/ajax/functions/WiSPLocationMembers.php");
 	include_once("include/ajax/functions/WiSPUsers.php");
 
 	define('RES_OK',0);
@@ -241,6 +244,64 @@
 
 			break;
 
+		# AdminRealmAttributes.js functions
+		case "addAdminRealmAttribute":
+
+			$res = addAdminRealmAttribute($soapParams);
+			if (isset($res)) {
+				ajaxException($res);
+			}
+
+			break;
+
+		case "updateAdminRealmAttribute":
+
+			$res = updateAdminRealmAttribute($soapParams);
+			if (isset($res)) {
+				ajaxException($res);
+			}
+
+			break;
+
+		case "getAdminRealmAttribute":
+			$rawData = getAdminRealmAttribute($soapParams);
+
+			$res = new json_response;
+			$res->setID('ID');
+			$res->addField('ID','int');
+			$res->addField('Name','string');
+			$res->parseHash($rawData);
+
+			echo json_encode($res->export());
+			break;
+
+		case "getAdminRealmAttributes":
+
+			$res = getAdminRealmAttributes($soapParams);
+			$rawData = $res[0]; $numResults = $res[1];
+
+			$res = new json_response;
+			$res->setID('ID');
+			$res->addField('ID','int');
+			$res->addField('Name','string');
+			$res->addField('Operator','string');
+			$res->addField('Value','string');
+			$res->addField('Disabled','boolean');
+			$res->parseArray($rawData);
+			$res->setDatasetSize($numResults);
+
+			echo json_encode($res->export());
+			break;
+
+		case "removeAdminRealmAttribute":
+
+			$res = removeAdminRealmAttribute($soapParams);
+			if (isset($res)) {
+				ajaxException($res);
+			}
+
+			break;
+
 		# AdminGroupAttributes.js functions
 		case "addAdminGroupAttribute":
 
@@ -417,6 +478,32 @@
 			echo json_encode($res->export());
 			break;
 
+		# WiSPLocationMembers.js functions
+		case "getWiSPLocationMembers":
+
+			$res = getWiSPLocationMembers($soapParams);
+			$rawData = $res[0]; $numResults = $res[1];
+
+			$res = new json_response;
+			$res->setID('ID');
+			$res->addField('ID','int');
+			$res->addField('Username','string');
+			$res->parseArray($rawData);
+			$res->setDatasetSize($numResults);
+
+			echo json_encode($res->export());
+
+			break;
+
+		case "removeWiSPLocationMember":
+
+			$res = removeWiSPLocationMember($soapParams);
+			if (isset($res)) {
+				ajaxException($res);
+			}
+
+			break;
+
 		# WiSPLocations.js functions
 		case "updateWiSPLocation":
 
diff --git a/webgui/include/ajax/functions/AdminGroupMembers.php b/webgui/include/ajax/functions/AdminGroupMembers.php
index e99d1ea6e47f63980a1f3b2cc27640d372f4b245..2df5aa09efd986a7b29787093a303b67752029e7 100644
--- a/webgui/include/ajax/functions/AdminGroupMembers.php
+++ b/webgui/include/ajax/functions/AdminGroupMembers.php
@@ -2,19 +2,7 @@
 
 include_once("include/db.php");
 
-# Add group attribute
-function addAdminGroupMember($params) {
-	global $db;
-
-	$res = DBDo("INSERT INTO group_attributes (GroupID,Name) VALUES (?,?)",array($params[0]['GroupID'],$params[0]['Name']));
-	if (!is_numeric($res)) {
-		return $res;
-	}
-
-	return NULL;
-}
-
-# Remove group attribute
+# Remove group member
 function removeAdminGroupMember($params) {
 	global $db;
 
@@ -26,39 +14,7 @@ function removeAdminGroupMember($params) {
 	return NULL;
 }
 
-# Edit attribute
-function updateAdminGroupMember($params) {
-	global $db;
-
-	$res = DBDo("UPDATE group_attributes SET Name = ? WHERE ID = ?",array($params[0]['Name'],$params[0]['ID']));
-	if (!is_numeric($res)) {
-		return $res;
-	}
-
-	return NULL;
-}
-
-# Return specific attribute row
-function getAdminGroupMember($params) {
-	global $db;
-
-
-	$res = DBSelect("SELECT ID, Name FROM group_attributes WHERE ID = ?",array($params[0]));
-	if (!is_object($res)) {
-		return $res;
-	}
-
-	$resultArray = array();
-
-	$row = $res->fetchObject();
-
-	$resultArray['ID'] = $row->id;
-	$resultArray['Name'] = $row->name;
-
-	return $resultArray;
-}
-
-# Return list of attributes
+# Return list of members
 function getAdminGroupMembers($params) {
 	global $db;
 
diff --git a/webgui/js/app/windows/AdminGroupMembers.js b/webgui/js/app/windows/AdminGroupMembers.js
index d8f840f924f85584882d299c9546f3627865e3f2..8ccb38a37be378a1a1a5375a7820b1df23bc8a4e 100644
--- a/webgui/js/app/windows/AdminGroupMembers.js
+++ b/webgui/js/app/windows/AdminGroupMembers.js
@@ -17,43 +17,6 @@ function showAdminGroupMembersWindow(groupID) {
 		{
 			// Inline toolbars
 			tbar: [
-				{
-					text:'Add',
-					tooltip:'Add member',
-					iconCls:'add',
-					handler: function() {
-						showAdminGroupMemberAddEditWindow(groupID);
-					}
-				}, 
-				'-', 
-				{
-					text:'Edit',
-					tooltip:'Edit member',
-					iconCls:'edit',
-					handler: function() {
-						var selectedItem = AdminGroupMembersWindow.getComponent('gridpanel').getSelectionModel().getSelected();
-						// Check if we have selected item
-						if (selectedItem) {
-							// If so display window
-							showAdminGroupMemberAddEditWindow(groupID,selectedItem.data.ID);
-						} else {
-							AdminGroupMembersWindow.getEl().mask();
-
-							// Display error
-							Ext.Msg.show({
-								title: "Nothing selected",
-								msg: "No member selected",
-								icon: Ext.MessageBox.ERROR,
-								buttons: Ext.Msg.CANCEL,
-								modal: false,
-								fn: function() {
-									AdminGroupMembersWindow.getEl().unmask();
-								}
-							});
-						}
-					}
-				},
-				'-', 
 				{
 					text:'Remove',
 					tooltip:'Remove member',
@@ -129,88 +92,6 @@ function showAdminGroupMembersWindow(groupID) {
 }
 
 
-// Display edit/add form
-function showAdminGroupMemberAddEditWindow(groupID,userID) {
-
-	var submitAjaxConfig;
-
-
-	// We doing an update
-	if (userID) {
-		submitAjaxConfig = {
-			ID: userID,
-			SOAPFunction: 'updateAdminGroupMember',
-			SOAPParams: 
-				'0:ID,'+
-				'0:Name'
-		};
-
-	// We doing an Add
-	} else {
-		submitAjaxConfig = {
-			GroupID: groupID,
-			SOAPFunction: 'addAdminGroupMember',
-			SOAPParams: 
-				'0:GroupID,'+
-				'0:Name'
-		};
-	}
-	
-	// Create window
-	var adminGroupMembersFormWindow = new Ext.ux.GenericFormWindow(
-		// Window config
-		{
-			title: "Member Information",
-
-			width: 475,
-			height: 260,
-
-			minWidth: 475,
-			minHeight: 260
-		},
-		// Form panel config
-		{
-			labelWidth: 85,
-			baseParams: {
-				SOAPUsername: globalConfig.soap.username,
-				SOAPPassword: globalConfig.soap.password,
-				SOAPAuthType: globalConfig.soap.authtype,
-				SOAPModule: 'AdminGroupMembers'
-			},
-			items: [
-				{
-					fieldLabel: 'Name',
-					name: 'Name',
-					vtype: 'usernamePart',
-					maskRe: usernamePartRe,
-					allowBlank: false
-				},
-			],
-		},
-		// Submit button config
-		submitAjaxConfig
-	);
-
-	adminGroupMembersFormWindow.show();
-
-	if (userID) {
-		adminGroupMembersFormWindow.getComponent('formpanel').load({
-			params: {
-				ID: userID,
-				SOAPUsername: globalConfig.soap.username,
-				SOAPPassword: globalConfig.soap.password,
-				SOAPAuthType: globalConfig.soap.authtype,
-				SOAPModule: 'AdminGroupMembers',
-				SOAPFunction: 'getAdminGroupMember',
-				SOAPParams: 'ID'
-			}
-		});
-	}
-}
-
-
-
-
 // Display remove form
 function showAdminGroupMemberRemoveWindow(parent,id) {
 	// Mask parent window