diff --git a/contrib/remsim-apitool.py b/contrib/remsim-apitool.py
new file mode 100755
index 0000000..35c8826
--- /dev/null
+++ b/contrib/remsim-apitool.py
@@ -0,0 +1,117 @@
+#!/usr/bin/env python3
+
+import sys
+import argparse
+import requests
+
+version = "0.1"
+
+#access rest
+def build_url(suffix):
+    BASE_PATH = "/api/backend/v1"
+    return ("http://" + server_host + ":" + server_port + BASE_PATH + suffix)
+
+def rest_get(suffix):
+    if verbose:
+        print("GET "+ build_url(suffix))
+    try:
+        resp = requests.get(build_url(suffix))
+    except:
+        print("REST GET failed")
+        return
+    if resp.ok:
+        try:
+            js = resp.json()
+            print("%s: %s" % (suffix, js))
+        except:
+            return
+    else:
+        return None
+
+def rest_post(suffix, js = None):
+    if verbose:
+        print("POST "+ build_url(suffix)+ str(js))
+    resp = requests.post(build_url(suffix), json=js)
+    if not resp.ok:
+        print("post failed")
+
+def rest_delete(suffix):
+    if verbose:
+        print("DELETE "+ build_url(suffix))
+    resp = requests.delete(build_url(suffix))
+    if not resp.ok:
+        print("delete failed")
+
+#rest calls
+def slotmap_create(bank_id, bank_slot, client_id, client_slot):
+    js = {
+        'bank': {'bankId': bank_id, 'slotNr': bank_slot},
+        'client': {'clientId': client_id, 'slotNr': client_slot},
+        }
+    return rest_post('/slotmaps', js)
+
+def slotmap_delete(bank_id, bank_slot):
+    slotmap_id = bank_id * 65536 + bank_slot
+    return rest_delete("/slotmaps/%u"%slotmap_id)
+
+def reset_global():
+    return rest_post('/global-reset')
+
+def main(argv):
+    global server_port, server_host, verbose
+
+    parser = argparse.ArgumentParser()
+    parser.add_argument("-H", "--host",    help="host to connect to",                        default="127.0.0.1")
+    parser.add_argument("-p", "--port",    help="port to connect to",                        default="9997")
+    parser.add_argument("-v", "--verbose", help="increase output verbosity", action="count", default=0)
+    group = parser.add_mutually_exclusive_group()
+    group.add_argument("-r", "--reset",          help="remove all mappings  (POST /global-reset)", action="store_true")
+    group.add_argument("-c", "--show-clients",   help="show clients         (GET /clients)",nargs='?',const="all",default=None)
+    group.add_argument("-b", "--show-banks",     help="show banks           (GET /banks)",nargs='?',const="all",default=None)
+    group.add_argument("-s", "--show-slotmaps",  help="show slotmaps        (GET /slotmaps)",nargs='?',const="all",default=None)
+    group.add_argument("-m", "--create-slotmap", help="create new slotmap   (POST /slotmaps)",nargs=4,metavar=('bank_id', 'bank_slot','client_id','client_slot'))
+    group.add_argument("-d", "--delete-slotmap", help="delete slotmapping   (DELETE /slotmaps/<id>)", type=int, nargs=2, metavar=('bank_id','bank_slot'))
+    group.add_argument("-a", "--show-all",       help="show all (default if no argument given)", action="store_true")
+
+    args = parser.parse_args()
+    if args.verbose:
+        print("verbosity = ", args.verbose)
+
+    server_host = args.host
+    server_port = args.port
+    verbose = args.verbose
+
+    if args.reset:
+        reset_global()
+        return
+    if args.show_clients:
+        if args.show_clients == "all":
+            rest_get("/clients")
+        else:
+            rest_get("/clients/" + str(args.show_clients))
+        return
+    if args.show_banks:
+        if args.show_banks == "all":
+            rest_get("/banks")
+        else:
+            rest_get("/banks/" + str(args.show_banks))
+        return
+    if args.show_slotmaps:
+        if args.show_slotmaps == "all":
+            rest_get("/slotmaps")
+        else:
+            rest_get("/slotmaps/" + str(args.show_slotmaps))
+        return
+    if args.create_slotmap:
+        slotmap_create(args.create_slotmap[0],args.create_slotmap[1],args.create_slotmap[2],args.create_slotmap[3])
+        return
+    if args.delete_slotmap:
+        slotmap_delete(args.delete_slotmap[0],args.delete_slotmap[1])
+        return
+    rest_get("/clients")
+    rest_get("/banks")
+    rest_get("/slotmaps")
+
+if __name__ == "__main__":
+    main(sys.argv)
+
