diff --git a/README.md b/README.md
index 077798cbdf2eaab943cf3292e8491596299bb40d..b7ba0eda5910d50b6871b067c05232aa33cb828b 100644
--- a/README.md
+++ b/README.md
@@ -23,6 +23,12 @@ Install the requirements.
 apt install python3 python3-dev python3-setuptools python3-pip libacl1-dev libkrb5-dev
 ```
 
+Optional packages:
+
+```
+apt install python3-venv
+```
+
 ### git / pip
 
 **Recommended** install from a clean venv (may be needed if you have any conflicting outdated modules installed as packages):
diff --git a/bin/showgroup.py b/bin/showgroup.py
index 6f23bed31f36b3ccb04ffd6cc9ed750b82ed7d64..6faac89912a88cb6f98bbbfd480679d5415309c4 100755
--- a/bin/showgroup.py
+++ b/bin/showgroup.py
@@ -20,13 +20,20 @@ NOOPTS = collections.OrderedDict()
 NOOPTS['no-member'] = 'memberUid'
 NOOPTS['no-gid'] = 'gidNumber'
 NOOPTS['no-owner'] = 'owner'
+NOOPTS['no-uid'] = 'uidNumber'
+NOOPTS['no-name'] = 'gecos'
 
 
 def main():
     description = 'Show groups or group members'
     arg = 'group'
     arg_help = 'The group name (cn), or wildcards (*, cn* , *cn*)'
-    args = argparser.simple(description, arg=arg, arg_help=arg_help, opts=OPTS, noopts=NOOPTS)
+    parser = argparser.extendable(description, arg=arg, arg_help=arg_help, opts=OPTS, noopts=NOOPTS)
+    parser.add_argument('--uids', dest='uid_only', action='store_const', const=True,
+                        help='Show uids only')
+    parser.add_argument('--names', dest='name_only', action='store_const', const=True,
+                        help='Show real names only')
+    args = vars(parser.parse_args())
 
     ldap = dphysldap.Ldap()
 
@@ -50,23 +57,34 @@ def main():
         group = groups[0]
         members = group['memberUid']
 
-        print('Group {} ({}):'.format(group['cn'], group['gidNumber']))
-        print('Owner: {}'.format(group['owner']))
-        print('Report: {}'.format(group['reportEnabled']))
-        print('Reported to: {}'.format(group['reportUid']))
+        if not args['name_only'] and not args['uid_only']:
+            print('Group {} ({}):'.format(group['cn'], group['gidNumber']))
+            print('Owner: {}'.format(group['owner']))
+            print('Report: {}'.format(group['reportEnabled']))
+            print('Reported to: {}'.format(group['reportUid']))
 
         if members:
             del OPTS['report']
 
             attrs = ['uid', 'uidNumber', 'gecos']
             attrs.extend([v for k, v in OPTS.items() if args[k]])
+            for attr in [v for k, v in NOOPTS.items() if args[k]]:
+                if attr in attrs:
+                    attrs.remove(attr)
 
             users = dphysldap.Users(ldap, attrs)
             users.search(';'.join(members))
             users.sort('uid')
 
-            print('Members:')
-            print(users)
+            if args['uid_only']:
+                for user in users:
+                    print(user['uid'])
+            elif args['name_only']:
+                for user in users:
+                    print(user['gecos'])
+            else:
+                print('Members:')
+                print(users)
 
         else:
             print('Members: none')
diff --git a/lib/isg/argparser.py b/lib/isg/argparser.py
index 0eef12537a0a4432f997931de8ece46b49b8e960..fdc18d02f007bf00e82637fe6482feed78a7145f 100644
--- a/lib/isg/argparser.py
+++ b/lib/isg/argparser.py
@@ -2,9 +2,10 @@
 
 import argparse
 
-def simple(description, arg=None, arg_help='', opts=dict(), noopts=dict()):
+
+def extendable(description, arg=None, arg_help='', opts=dict(), noopts=dict()):
     """
-    Get cmd argument with simplified argparser
+    Get extendable simplified argparser
     """
     parser = argparse.ArgumentParser(
         add_help=False, description=description)
@@ -15,18 +16,39 @@ def simple(description, arg=None, arg_help='', opts=dict(), noopts=dict()):
     for k, v in opts.items():
         if isinstance(v, list):
             v = ', '.join(v)
-        parser.add_argument('-' + k[:1], '--' + k, dest=k,
-                            action='store_const', const=True,
-                            help='Show ' + v)
+
+        try:
+            parser.add_argument('-' + k[:1], '--' + k, dest=k,
+                                action='store_const', const=True,
+                                help='Show ' + v)
+        except argparse.ArgumentError:
+            parser.add_argument('--' + k, dest=k,
+                                action='store_const', const=True,
+                                help='Show ' + v)
 
     for k, v in noopts.items():
         if isinstance(v, list):
             v = ', '.join(v)
-        parser.add_argument('-' + k[3:4].upper(), '--' + k, dest=k,
-                            action='store_const', const=True,
-                            help='Hide ' + v)
+
+        try:
+            parser.add_argument('-' + k[3:4].upper(), '--' + k, dest=k,
+                                action='store_const', const=True,
+                                help='Hide ' + v)
+        except argparse.ArgumentError:
+            parser.add_argument('--' + k, dest=k,
+                                action='store_const', const=True,
+                                help='Hide ' + v)
 
     parser.add_argument('--help', action='help',
                         help='Show this help message and exit')
 
+    return parser
+
+
+def simple(description, arg=None, arg_help='', opts=dict(), noopts=dict()):
+    """
+    Get cmd argument with simplified argparser
+    """
+    parser = extendable(description, arg=arg, arg_help=arg_help, opts=opts, noopts=noopts)
+
     return vars(parser.parse_args())
diff --git a/lib/isg/dphysldap.py b/lib/isg/dphysldap.py
index 7aaeb68f2889d68588a01a58e1de124c22a997e3..b52dcc4aded47aa3779a607710a838c4db5d2bdb 100644
--- a/lib/isg/dphysldap.py
+++ b/lib/isg/dphysldap.py
@@ -60,7 +60,7 @@ class Entry(collections.abc.MutableMapping):
 
     def __len__(self):
         return len(self._dict)
-    
+
     def __str__(self):
         """
         Modifies the "informal" string value of str(x) or print(x)