diff --git a/include/patty/ax25/sock.h b/include/patty/ax25/sock.h
index 319b386..a66ed1f 100644
--- a/include/patty/ax25/sock.h
+++ b/include/patty/ax25/sock.h
@@ -96,7 +96,8 @@ void patty_ax25_sock_reset(patty_ax25_sock *sock);
 
 void patty_ax25_sock_destroy(patty_ax25_sock *sock);
 
-int patty_ax25_sock_upgrade(patty_ax25_sock *sock);
+int patty_ax25_sock_upgrade(patty_ax25_sock *sock,
+                            enum patty_ax25_version version);
 
 int patty_ax25_sock_params_set(patty_ax25_sock *sock,
                                patty_ax25_params *params);
diff --git a/src/server.c b/src/server.c
index 069e507..1379a0d 100644
--- a/src/server.c
+++ b/src/server.c
@@ -1407,7 +1407,7 @@ static int handle_xid(patty_ax25_server *server,
          * upgrade the socket defaults accordingly, and negotiate downwards
          * as necessary.
          */
-        if (patty_ax25_sock_upgrade(remote) < 0) {
+        if (patty_ax25_sock_upgrade(remote, PATTY_AX25_2_2) < 0) {
             goto error_sock_upgrade;
         }
 
@@ -1465,7 +1465,7 @@ static int handle_xid(patty_ax25_server *server,
 
         patty_ax25_sock_bind_if(remote, iface);
 
-        patty_ax25_sock_upgrade(remote);
+        patty_ax25_sock_upgrade(remote, PATTY_AX25_2_2);
 
         if (patty_ax25_sock_params_set(remote, &params) < 0) {
             patty_ax25_sock_destroy(remote);
diff --git a/src/sock.c b/src/sock.c
index 7e483b5..5654372 100644
--- a/src/sock.c
+++ b/src/sock.c
@@ -169,13 +169,26 @@ void patty_ax25_sock_destroy(patty_ax25_sock *sock) {
     free(sock);
 }
 
-int patty_ax25_sock_upgrade(patty_ax25_sock *sock) {
-    sock->version     = PATTY_AX25_2_2;
-    sock->flags_hdlc  = PATTY_AX25_SOCK_2_2_DEFAULT_HDLC;
-    sock->n_maxlen_tx = PATTY_AX25_SOCK_2_2_DEFAULT_MAXLEN;
-    sock->n_maxlen_rx = PATTY_AX25_SOCK_2_2_DEFAULT_MAXLEN;
-    sock->n_window_tx = PATTY_AX25_SOCK_2_2_DEFAULT_WINDOW;
-    sock->n_window_rx = PATTY_AX25_SOCK_2_2_DEFAULT_WINDOW;
+int patty_ax25_sock_upgrade(patty_ax25_sock *sock,
+                            enum patty_ax25_version version) {
+    if (sock->version >= version) {
+        return 0;
+    }
+
+    switch (version) {
+        case PATTY_AX25_OLD:
+        case PATTY_AX25_2_0:
+            break;
+
+        case PATTY_AX25_2_2:
+            sock->flags_hdlc  = PATTY_AX25_SOCK_2_2_DEFAULT_HDLC;
+            sock->n_maxlen_tx = PATTY_AX25_SOCK_2_2_DEFAULT_MAXLEN;
+            sock->n_maxlen_rx = PATTY_AX25_SOCK_2_2_DEFAULT_MAXLEN;
+            sock->n_window_tx = PATTY_AX25_SOCK_2_2_DEFAULT_WINDOW;
+            sock->n_window_rx = PATTY_AX25_SOCK_2_2_DEFAULT_WINDOW;
+    }
+
+    sock->version = version;
 
     return init_bufs(sock);
 }