diff --git a/admin/tools/groups.tool b/admin/tools/groups.tool
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..16e4fb034500f5914fa6fc95d6bb796cb8034507 100644
--- a/admin/tools/groups.tool
+++ b/admin/tools/groups.tool
@@ -0,0 +1,302 @@
+<div class="groups-table-wrapper">
+	<table class="table table-hover groups-table">
+		<thead>
+			<tr>
+			</tr>
+		</thead>
+		<tbody>
+		</tbody>
+	</table>
+</div>
+
+<style>
+	.groups-table-wrapper {
+		width: 100%;
+		height: 100%;
+		overflow: auto;
+	}
+</style>
+<script type="text/javascript">
+	var groups = {
+		showInTable: ['firstname', 'lastname', 'nethz', 'legi', 'membership'],
+		curgroupData: null,
+
+		// Page
+		page: {
+			max: Number.MAX_VALUE,
+			cur: function() {
+				return parseInt(tools.mem.session.get('curPage'));
+			},
+			set: function(num) {
+				num = parseInt(num);
+				if (num > 0 && num < groups.page.max + 1)
+					tools.mem.session.set('curPage', num);
+				$('.groups-cur-page-cont').html(groups.page.cur());
+				groups.get();
+			},
+			inc: function() {
+				groups.page.set(groups.page.cur() + 1);
+			},
+			dec: function() {
+				groups.page.set(groups.page.cur() - 1);
+			}
+		},
+
+		//Sorting
+		sort: {
+			cur: function() {
+				return tools.mem.session.get('curSort');
+			},
+			set: function(sort) {
+				tools.mem.session.set('curSort', sort);
+				groups.get();
+			},
+			inv: function() {
+				var tmp = groups.sort.cur();
+				if (tmp.charAt(0) == '-')
+					groups.sort.set(tmp.slice(1));
+				else
+					groups.sort.set('-' + tmp);
+			}
+		},
+
+		//Searching
+		search: {
+			cur: function() {
+				return tools.mem.session.get('search');
+			},
+			set: function(dom, val) {
+				tools.mem.session.set('search', dom + '==' + val);
+				groups.page.set(1);
+			},
+			clr: function() {
+				tools.mem.session.set('search', '');
+				groups.page.set(1);
+			},
+		},
+
+		// Get groups
+		get: function() {
+			amivcore.groups.GET({
+				data: {
+					'max_results': '50',
+					//page: groups.page.cur(),
+					//sort: groups.sort.cur(),
+					//where: groups.search.cur(),
+				}
+			}, function(ret) {
+
+				if (ret === undefined || ret['_items'].length == 0) {
+					tools.log('No Data', 'w');
+					return;
+				}
+
+				groups.meta = ret['_meta'];
+				groups.page.max = Math.ceil(groups.meta.total / groups.meta.max_results);
+				$('.groups-page-max-cont').html(groups.page.max);
+
+				// Clear table from previous contentent
+				$('.groups-table thead tr, .groups-table tbody').html('');
+
+				groups.showInTable.forEach(function(i) {
+					$('.groups-table thead tr').append('<th>' + i + '</th>');
+				});
+
+				for (var n in ret['_items']) {
+					var tmp = '';
+					groups.showInTable.forEach(function(i) {
+						tmp += '<td>' + ret['_items'][n][i] + '</td>';
+					});
+					$('.groups-table tbody').append('<tr data-id="' + ret['_items'][n]['id'] + '">' + tmp + '</tr>');
+				}
+				$('.groups-table tbody tr').click(groups.showDetails);
+			});
+		},
+
+		// Make Modal with editable table data
+		showDetails: function() {
+			amivcore.groups.GET({
+				id: $(this).attr('data-id')
+			}, function(ret) {
+				curgroupData = ret;
+				var tmp = '<table class="table table-hover groups-group-edit-table" data-etag="' + ret['_etag'] + '"><tbody>';
+				for (var cur in ret)
+					if (cur.charAt(0) != '_')
+						tmp += '<tr><td>' + cur + '</td><td contenteditable>' + ret[cur] + '</td></tr>'
+				tmp += '</tbody></table>';
+
+				tools.modal({
+					head: ret.firstname + ' ' + ret.lastname,
+					body: tmp,
+					button: {
+						'Update': {
+							type: 'success',
+							close: true,
+							callback: groups.inspectgroup,
+						}
+					}
+				});
+
+			});;
+		},
+
+		// Check wether changes were maid and saves it in that case
+		inspectgroup: function() {
+			var newgroupData = {};
+			$('.groups-group-edit-table tr').each(function() {
+				newgroupData[$(this).children('td:nth-child(1)').html()] = $(this).children('td:nth-child(2)').html();
+			});
+			var changed = false,
+				curgroupDataChanged = {};
+			for (var i in newgroupData) {
+				if (newgroupData[i] != String(curgroupData[i])) {
+					changed = true;
+					curgroupDataChanged[i] = newgroupData[i];
+				}
+			}
+			if (changed) {
+				amivcore.groups.PATCH({
+					id: curgroupData.id,
+					header: {
+						'If-Match': $('.groups-group-edit-table').attr('data-etag')
+					},
+					data: curgroupDataChanged
+				}, function() {
+					tools.log('group Updated', 's');
+					groups.get();
+				});
+			}
+		},
+
+		//Make new group
+		add: function() {
+			var tmp = '<table class="table table-hover table-bordered groups-group-add-table"><tbody>',
+				reqFields = amivcore.getRequiredFields('groups', 'POST');
+			for (var reqField in reqFields)
+				tmp += '<tr><td>' + reqField + '</td><td contenteditable></td></tr>'
+			tmp += '</tbody></table>';
+			tools.modal({
+				head: 'New group',
+				body: tmp,
+				button: {
+					'Add': {
+						type: 'success',
+						close: true,
+						callback: function() {
+							var newgroupData = {};
+							$('.groups-group-add-table tr').each(function() {
+								newgroupData[$(this).children('td:nth-child(1)').html()] = $(this).children('td:nth-child(2)').html();
+							});
+							amivcore.groups.POST({
+								data: newgroupData
+							}, function(ret) {
+								if (!ret.hasOwnProperty('_status') || ret['_status'] != 'OK')
+									tools.log(JSON.stringify(ret.responseJSON['_issues']), 'e');
+								else {
+									tools.log('group Added', 's');
+									groups.get();
+								}
+							});
+						}
+					}
+				}
+			});
+		}
+	};
+
+	// Setup Menu
+	tools.ui.menu({
+		'<span class="glyphicon glyphicon-group" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Create group"></span>': {
+			callback: groups.add
+		},
+		'<span class="glyphicon glyphicon-arrow-left" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Previous Page"></span>': {
+			callback: groups.page.dec
+		},
+		'<span data-toggle="tooltip" data-placement="bottom" title="Set Page"><span class="groups-cur-page-cont" aria-hidden="true"></span> / <span class="groups-page-max-cont" aria-hidden="true"></span></span>': {
+			callback: function() {
+				tools.modal({
+					head: 'Go To Page:',
+					body: '<div class="form-group"><input type="number" value="' + groups.page.cur() + '" class="form-control groups-go-page"></div>',
+					button: {
+						'Go': {
+							type: 'success',
+							close: true,
+							callback: function() {
+								groups.page.set($('.groups-go-page').val());
+							},
+						}
+					}
+				});
+			}
+		},
+		'<span class="glyphicon glyphicon-arrow-right" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Next Page"></span>': {
+			callback: groups.page.inc
+		},
+		'<span class="glyphicon glyphicon-sort" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Sort"></span>': {
+			callback: function() {
+				var tmp = '<div class="form-group"><select class="form-control groups-sort-select">';
+				var cur = groups.sort.cur();
+				['id', 'firstname', 'lastname', 'membership', 'nethz'].forEach(function(i) {
+					tmp += '<option value="' + i + '"' + ((i == cur) ? ' selected' : '') + '>&#8673; ' + i + '</option>';
+					tmp += '<option value="-' + i + '"' + (('-' + i == cur) ? ' selected' : '') + '>&#8675; ' + i + '</option>';
+				});
+				tmp += '</select></div>';
+				tools.modal({
+					head: 'Sort',
+					body: tmp,
+					button: {
+						'Sort': {
+							type: 'success',
+							close: true,
+							callback: function() {
+								groups.sort.set($('.groups-sort-select').val());
+							}
+						}
+					}
+
+				});
+			}
+		},
+		'<span class="glyphicon glyphicon-search" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Search"></span>': {
+			callback: function() {
+				var tmp = '<div class="form-group"><select class="form-control groups-search-select">';
+				var cur = groups.search.cur();
+				if (cur === null || cur == '')
+					cur = '';
+				else
+					cur = cur.split('==')[1];
+				['id', 'firstname', 'lastname'].forEach(function(i) {
+					tmp += '<option value="' + i + '"' + ((i == cur) ? ' selected' : '') + '>' + i + '</option>';
+				});
+				tmp += '</select><br><input type="text" value="' + cur + '" class="form-control groups-search-val"></div>';
+				tools.modal({
+					head: 'Search',
+					body: tmp,
+					button: {
+						'Clear': {
+							type: 'warning',
+							close: true,
+							callback: groups.search.clr,
+						},
+						'Search': {
+							type: 'success',
+							close: true,
+							callback: function() {
+								groups.search.set($('.groups-search-select').val(), $('.groups-search-val').val());
+							}
+						},
+					}
+				})
+			}
+		}
+	});
+
+	//Set Toolpit
+	$('[data-toggle="tooltip"]').tooltip()
+
+	// Set Initail Page and get first groups
+	if (groups.page.cur() === null || isNaN(groups.page.cur()))
+		groups.page.set(1);
+	else
+		groups.page.set(groups.page.cur());
+</script>