diff --git a/src/allclients.py b/src/allclients.py
index 0e86f774bec25e8c4e492051aa7baeffac3259a1..10b1784d26d3d259604f34290449e1ee9c7eaaaf 100644
--- a/src/allclients.py
+++ b/src/allclients.py
@@ -1,6 +1,6 @@
 #!/usr/bin/python3
 
-import optparse
+import argparse
 import os
 import re
 import allclients.ssh
@@ -10,62 +10,64 @@ import netgroup
 import socket
 import subprocess
 
-class VerboseOptionParser(optparse.OptionParser):
-    def error(self, msg):
-        self.print_help()
-        optparse.OptionParser.error(self, msg)
-        pass
-    pass
-
 def local_interfaces():
     ip = subprocess.check_output([ 'ip', 'addr', 'show' ]).decode('utf8')
     return (re.findall('inet\\s+([0-9.]+)/[0-9]+', ip, re.MULTILINE) +
             re.findall('inet6\\s+([0-9a-f:]+)/[0-9]+', ip, re.MULTILINE))
 
 if __name__ == '__main__':
-    optParser = VerboseOptionParser(usage="%prog [options] command*")
-    optParser.add_option("-4", "--ipv4",
-                         action="store_true",
-                         help="force connections to be over ipv4")
-    optParser.add_option("-6", "--ipv6",
-                         action="store_true",
-                         help="force connections to be over ipv6")
-    optParser.add_option("-a", "--active",
-                         type=int,
-                         action="store", default=10,
-                         metavar="N",
-                         help="run at most N commands in paralell [10]")
-    optParser.add_option("-g", "--group",
-                         action="append", default=[],
-                         metavar="GROUP",
-                         help="apply actions to GROUP")
-    optParser.add_option("-m", "--machine",
-                         action="append", default=[],
-                         metavar="MACHINE",
-                         help="apply actions to MACHINE")
-    optParser.add_option("-o", "--ordered",
-                         action="store_true", default=False,
-                         help="order result by hostname")
-    optParser.add_option("-n", "--dry-run",
-                         action="store_true", default=False,
-                         help="dont't actually run commands")
-    optParser.add_option("-q", "--quiet",
-                         action="store_true", default=False,
-                         help="dont't show progress or color")
-    optParser.add_option("-s", "--self",
-                         action="store_true", default=False,
-                         help="run command on invoking host also")
-    optParser.add_option("-t", "--timeout",
-                         type=int,
-                         action="store", default=5,
-                         metavar="SECONDS",
-                         help="wait at most SECONDS for a connection")
-    optParser.add_option("-u", "--user",
-                         action="store", default=None,
-                         metavar="USER",
-                         help="run actions as USER")
-    optParser.disable_interspersed_args()
-    (options, args) = optParser.parse_args(sys.argv[1:])
+    parser = argparse.ArgumentParser(usage="%(prog)s [options] [--] command*")
+    parser.add_argument("-4", "--ipv4",
+                        action="store_true",
+                        help="force connections to be over ipv4")
+    parser.add_argument("-6", "--ipv6",
+                        action="store_true",
+                        help="force connections to be over ipv6")
+    parser.add_argument("-a", "--active",
+                        type=int,
+                        action="store", default=16,
+                        metavar="N",
+                        help="run at most N commands in paralell [10]")
+    parser.add_argument("-g", "--group",
+                        nargs='+',
+                        action="extend",
+                        default=[],
+                        metavar="NETGROUP",
+                        help="apply actions to members of NETGROUP")
+    parser.add_argument("-m", "--machine",
+                        nargs='+',
+                        default=[],
+                        action="extend",
+                        metavar="HOST",
+                        help="apply actions to HOST")
+    parser.add_argument("-o", "--ordered",
+                        action="store_true", default=False,
+                        help="order result by hostname")
+    parser.add_argument("-n", "--dry-run",
+                        action="store_true", default=False,
+                        help="dont't actually run commands")
+    parser.add_argument("-q", "--quiet",
+                        action="store_true", default=False,
+                        help="dont't show progress or color")
+    parser.add_argument("-s", "--self",
+                        action="store_true", default=False,
+                        help="run command on invoking host also")
+    parser.add_argument("-t", "--timeout",
+                        type=int,
+                        action="store", default=5,
+                        metavar="SECONDS",
+                        help="wait at most SECONDS for a connection")
+    parser.add_argument("-u", "--user",
+                        action="store", default=None,
+                        metavar="USER",
+                        help="run actions as USER")
+    (options,args)  = parser.parse_known_intermixed_args(sys.argv[1:])
+    if len(args) and args[0] == '--':
+        args = args[1:]
+        pass
+    if len(args) == 0 and not options.dry_run:
+        raise Exception("Commmand not given, if last argument is '--machine/--group', "
+                        "add '--' before command")
 
     if options.ipv4 and options.ipv6:
         raise Exception('Only one --ipv4 or --ipv6 may be specified')