diff --git a/setup.cfg b/setup.cfg
index bb53b3cbaab8bfb0cbee27942d5c4fee1562fb45..8f25e82f2171f20026544cf5ad887bee3f16e0d1 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -5,4 +5,4 @@ version = 1.7
 [options]
 packages = find:
 scripts = vcheck.py
-install_requires = prometheus_client; requests; pyyaml; packaging
+install_requires = prometheus_client; requests; pyyaml; semver
diff --git a/test_requirements b/test_requirements
index a2a130be474da70a02704f1c659a1135929f97a5..8ff32243ad1b9d98062449669bd4eb5c9bc49d2d 100644
--- a/test_requirements
+++ b/test_requirements
@@ -1,6 +1,6 @@
 prometheus_client
 requests
 pyyaml
-packaging
+semver
 pytest
 pytest-cov
diff --git a/vcheck.py b/vcheck.py
index 244675b095a75956620bb30b12ead530d82a22de..d5e3e0d439a63a685e2b71e6a99bee867fa31905 100755
--- a/vcheck.py
+++ b/vcheck.py
@@ -11,7 +11,8 @@ import threading
 import json
 import re
 import yaml
-from packaging import version
+import semver
+import logging
 
 html_start = """<!DOCTYPE html>
 <html>
@@ -163,13 +164,17 @@ def remove_by_label(g, p):
             g.remove(*sample.labels.values())
 
 
+def version_parse(version):
+    return semver.Version.parse(version, optional_minor_and_patch=True)
+
+
 def latest(versions, pattern):
     p = re.compile(pattern)
     v = [ v for v in versions if p.search(v) ]
     if len(v) == 0:
         return None, None
     else:
-        v.sort(key = version.parse, reverse = True)
+        v.sort(key = version_parse, reverse = True)
         return v[0], None
 
 
@@ -274,16 +279,16 @@ def read_conf(confd):
                         'version' in entry for entry in doc):
                     checks += doc
                 else:
-                    print(f'{f}: Format error')
+                    logging.error(f'{f}: Format error')
             except yaml.YAMLError as err:
-                print(f'{f}: {err}')
+                logging.error(f'{f}: {err}')
     return checks
 
 
 def missing(d, *keys):
     for k in keys:
         if k not in d:
-            print(f"check {d['name']} missing required key {k}")
+            logging.error(f'check {d["name"]} missing required key {k}')
             return(f'config missing required key {k}')
     return None
 
@@ -317,7 +322,7 @@ def check(confd, v):
                 (current, error) = debian(c['id'], c['release'])
         else:
             error = f"check \"{c['check']}\" unknown"
-            print(f"check {c['name']} has unknown check {c['check']}")
+            logging.warning(f'check {c["name"]} has unknown check {c["check"]}')
 
         if not current:
             res += td(c['name'], c['version'], f'UNKNOWN: {error}', 'unknown')
@@ -358,13 +363,13 @@ def start_http_server(port, addr=''):
     t = threading.Thread(target=httpd.serve_forever)
     t.daemon = True
     t.start()
-    print('serving on port', port)
+    logging.info(f'Serving on port {port}')
 
 
 def shutdown(signal, frame):
     global running
     running = False
-    print(f'{Signals(signal).name} received')
+    logging.info(f'{Signals(signal).name} received')
 
 def params():
     port = environ.get('VC_PORT', default='8080')
@@ -392,9 +397,10 @@ def run(port, confd, recheck):
                 break
             sleep(1)
 
-    print('stopping server')
+    logging.info('stopping server')
 
 if __name__ == '__main__':  # pragma: no cover
+    logging.basicConfig(level=logging.INFO)
     signal(SIGINT, shutdown)
     signal(SIGHUP, shutdown)
     signal(SIGTERM, shutdown)