diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c
index 3d1137571..d37f74216 100644
--- a/rigs/kenwood/kenwood.c
+++ b/rigs/kenwood/kenwood.c
@@ -306,7 +306,7 @@ transaction_write:
         /* XXX the if is temporary, until all invocations are fixed */
         if (cmdstr[len - 1] != ';' && cmdstr[len - 1] != '\r')
         {
-            cmd[len] = caps->cmdtrm;
+            cmd[len] = caps->cmdtrm[0];
             len++;
         }
 
@@ -662,7 +662,18 @@ int kenwood_init(RIG *rig)
     priv = rig->state.priv;
 
     memset(priv, 0x00, sizeof(struct kenwood_priv_data));
-    strcpy(priv->verify_cmd, RIG_IS_XG3 ? ";" : "ID;");
+    if (RIG_IS_XG3)
+    {
+        priv->verify_cmd[0] = caps->cmdtrm[0];
+        priv->verify_cmd[1] ='\0';
+    }
+    else
+    {
+        priv->verify_cmd[0] ='I';
+        priv->verify_cmd[1] ='D';
+        priv->verify_cmd[2] = caps->cmdtrm[0];
+        priv->verify_cmd[3] ='\0';
+    }
     priv->split = RIG_SPLIT_OFF;
     priv->trn_state = -1;
     priv->curr_mode = 0;
@@ -697,6 +708,7 @@ int kenwood_cleanup(RIG *rig)
 int kenwood_open(RIG *rig)
 {
     struct kenwood_priv_data *priv = rig->state.priv;
+    struct kenwood_priv_caps *caps = kenwood_caps(rig);
     int err, i;
     char *idptr;
     char id[KENWOOD_MAX_BUF_LEN];
@@ -799,7 +811,10 @@ int kenwood_open(RIG *rig)
 
         /* here we know there is something that responds to FA but not
            to ID so use FA as the command verification command */
-        strcpy(priv->verify_cmd, "FA;");
+        priv->verify_cmd[0] = F';
+        priv->verify_cmd[1] = A';
+        priv->verify_cmd[2] = caps->cmdtrm ;
+        priv->verify_cmd[3] = \0;
         strcpy(id, "ID019");      /* fake a TS-2000 */
     }
     else
@@ -862,19 +877,25 @@ int kenwood_open(RIG *rig)
             kenwood_get_trn(rig, &priv->trn_state);  /* ignore errors */
             /* Currently we cannot cope with AI mode so turn it off in
                case last client left it on */
-            kenwood_set_trn(rig, RIG_TRN_OFF); /* ignore status in case
-                                            it's not supported */
-            // call get_split to fill in current split and tx_vfo status
-            retval = kenwood_get_split_vfo_if(rig, RIG_VFO_A, &split, &tx_vfo);
-
-            if (retval != RIG_OK)
+            if (priv->trn_state != RIG_TRN_OFF)
             {
-                rig_debug(RIG_DEBUG_ERR, "%s: %s\n", __func__, rigerror(retval));
+                kenwood_set_trn(rig, RIG_TRN_OFF); /* ignore status in case
+                                                      it's not supported */
+            }
+
+            if (!RIG_IS_THD74 && !RIG_IS_THD7A)
+            {
+                // call get_split to fill in current split and tx_vfo status
+                retval = kenwood_get_split_vfo_if(rig, RIG_VFO_A, &split, &tx_vfo);
+                if (retval != RIG_OK)
+                {
+                    rig_debug(RIG_DEBUG_ERR, "%s: %s\n", __func__, rigerror(retval));
+                }
+                priv->tx_vfo = tx_vfo;
+                rig_debug(RIG_DEBUG_VERBOSE, "%s: priv->tx_vfo=%s\n", __func__,
+                          rig_strvfo(priv->tx_vfo));
             }
 
-            priv->tx_vfo = tx_vfo;
-            rig_debug(RIG_DEBUG_VERBOSE, "%s: priv->tx_vfo=%s\n", __func__,
-                      rig_strvfo(priv->tx_vfo));
             return RIG_OK;
         }
 
@@ -3402,6 +3423,7 @@ int kenwood_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd)
  */
 int kenwood_set_trn(RIG *rig, int trn)
 {
+    char buf[5];
     rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
 
     switch (rig->caps->rig_model)
@@ -3410,9 +3432,9 @@ int kenwood_set_trn(RIG *rig, int trn)
         return kenwood_transaction(rig, (trn == RIG_TRN_RIG) ? "AI2" : "AI0", NULL, 0);
         break;
 
+    case RIG_MODEL_THD7A:
     case RIG_MODEL_THD74:
-        return kenwood_transaction(rig, (trn == RIG_TRN_RIG) ? "AI 1" : "AI 0", NULL,
-                                   4);
+        return kenwood_transaction(rig, (trn == RIG_TRN_RIG) ? "AI 1" : "AI 0", buf, sizeof buf);
         break;
 
     default:
@@ -3443,7 +3465,7 @@ int kenwood_get_trn(RIG *rig, int *trn)
         return -RIG_ENAVAIL;
     }
 
-    if (RIG_IS_THD74)
+    if (RIG_IS_THD74 || RIG_IS_THD7A)
     {
         retval = kenwood_safe_transaction(rig, "AI", trnbuf, 6, 4);
     }
@@ -3457,7 +3479,7 @@ int kenwood_get_trn(RIG *rig, int *trn)
         return retval;
     }
 
-    if (RIG_IS_THD74)
+    if (RIG_IS_THD74 || RIG_IS_THD7A)
     {
         *trn = trnbuf[3] != '0' ? RIG_TRN_RIG : RIG_TRN_OFF;
     }
diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h
index ec48b6abf..8030f9de2 100644
--- a/rigs/kenwood/kenwood.h
+++ b/rigs/kenwood/kenwood.h
@@ -80,6 +80,7 @@ extern const struct confparams kenwood_cfg_params[];
 #define RIG_IS_HPSDR     (rig->caps->rig_model == RIG_MODEL_HPSDR)
 #define RIG_IS_K2        (rig->caps->rig_model == RIG_MODEL_K2)
 #define RIG_IS_K3        (rig->caps->rig_model == RIG_MODEL_K3)
+#define RIG_IS_THD7A     (rig->caps->rig_model == RIG_MODEL_THD7A)
 #define RIG_IS_THD74     (rig->caps->rig_model == RIG_MODEL_THD74)
 #define RIG_IS_TS2000    (rig->caps->rig_model == RIG_MODEL_TS2000)
 #define RIG_IS_TS50      (rig->caps->rig_model == RIG_MODEL_TS50)
diff --git a/rigs/kenwood/th.c b/rigs/kenwood/th.c
index a6e6e1ac0..a7750adb3 100644
--- a/rigs/kenwood/th.c
+++ b/rigs/kenwood/th.c
@@ -245,7 +245,7 @@ th_set_freq(RIG *rig, vfo_t vfo, freq_t freq)
     // cppcheck-suppress *
     sprintf(buf, "FQ %011"PRIll",%X", (int64_t) freq_sent, step);
 
-    return kenwood_transaction(rig, buf, NULL, 0);
+    return kenwood_transaction(rig, buf, buf, sizeof buf);
 }
 
 /*
@@ -293,7 +293,6 @@ int
 th_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
 {
     char kmode, mdbuf[8];
-    int retval;
     const struct kenwood_priv_caps *priv = (const struct kenwood_priv_caps *)
                                            rig->caps->priv;
 
@@ -338,14 +337,7 @@ th_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
 
     sprintf(mdbuf, "MD %c", kmode);
 
-    retval = kenwood_transaction(rig, mdbuf, NULL, 0);
-
-    if (retval != RIG_OK)
-    {
-        return retval;
-    }
-
-    return RIG_OK;
+    return kenwood_transaction(rig, mdbuf, mdbuf, sizeof mdbuf);
 }
 
 /*
@@ -422,7 +414,8 @@ th_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
 int
 th_set_vfo(RIG *rig, vfo_t vfo)
 {
-    const char *cmd;
+    int retval;
+    char cmd[8];
 
     rig_debug(RIG_DEBUG_TRACE, "%s: called\n", __func__);
 
@@ -437,31 +430,24 @@ th_set_vfo(RIG *rig, vfo_t vfo)
     /* set band */
     if (vfo != RIG_VFO_MEM)
     {
-        int retval;
-
         switch (vfo)
         {
         case RIG_VFO_A:
         case RIG_VFO_VFO:
         case RIG_VFO_MAIN:
-            cmd = "BC 0";
+            strncpy (cmd, "BC 0", sizeof cmd);
             break;
 
         case RIG_VFO_B:
         case RIG_VFO_SUB:
-            cmd = "BC 1";
+            strncpy (cmd, "BC 1", sizeof cmd);
             break;
 
         default:
             return kenwood_wrong_vfo(__func__, vfo);
         }
 
-        retval = kenwood_simple_transaction(rig, cmd, 5);
-
-        if (retval != RIG_OK)
-        {
-            return retval;
-        }
+        return kenwood_transaction(rig, cmd, cmd, sizeof cmd);
     }
 
     /* No "VMC" cmd on THD72A/THD74 */
@@ -477,23 +463,29 @@ th_set_vfo(RIG *rig, vfo_t vfo)
     case RIG_VFO_A:
     case RIG_VFO_VFO:
     case RIG_VFO_MAIN:
-        cmd = "VMC 0,0";
+        strncpy (cmd, "VMC 0,0", sizeof cmd);
         break;
 
     case RIG_VFO_B:
     case RIG_VFO_SUB:
-        cmd = "VMC 1,0";
+        strncpy (cmd, "VMC 1,0", sizeof cmd);
         break;
 
     case RIG_VFO_MEM:
+        strncpy (cmd, "BC", sizeof cmd);
+        retval = kenwood_transaction (rig, cmd, cmd, sizeof cmd);
+        if (retval != RIG_OK)
+        {
+            return retval;
+        }
         if (rig->caps->rig_model == RIG_MODEL_THF7E ||
                 rig->caps->rig_model == RIG_MODEL_THF6A)
         {
-            cmd = "VMC 0,1";
+            snprintf (cmd, sizeof cmd, "VMC %c,1", cmd[3]);
         }
         else
         {
-            cmd = "VMC 0,2";
+            snprintf (cmd, sizeof cmd, "VMC %c,2", cmd[3]);
         }
 
         break;
@@ -502,7 +494,7 @@ th_set_vfo(RIG *rig, vfo_t vfo)
         return kenwood_wrong_vfo(__func__, vfo);
     }
 
-    return kenwood_transaction(rig, cmd, NULL, 0);
+    return kenwood_transaction(rig, cmd, cmd, sizeof cmd);
 }
 
 int
@@ -636,7 +628,7 @@ th_get_vfo(RIG *rig, vfo_t *vfo)
 int tm_set_vfo_bc2(RIG *rig, vfo_t vfo)
 {
     struct kenwood_priv_data *priv = rig->state.priv;
-    char vfobuf[16], ackbuf[16];
+    char cmd[16];
     int vfonum, txvfonum, vfomode = 0;
     int retval;
 
@@ -661,15 +653,15 @@ int tm_set_vfo_bc2(RIG *rig, vfo_t vfo)
 
     case RIG_VFO_MEM:
         /* get current band */
-        sprintf(vfobuf, "BC");
-        retval = kenwood_transaction(rig, vfobuf, ackbuf, sizeof(ackbuf));
+        snprintf(cmd, sizeof cmd, "BC");
+        retval = kenwood_transaction(rig, cmd, cmd, sizeof cmd);
 
         if (retval != RIG_OK)
         {
             return retval;
         }
 
-        txvfonum = vfonum = ackbuf[3] - '0';
+        txvfonum = vfonum = cmd[3] - '0';
         vfomode = 2;
         break;
 
@@ -678,8 +670,8 @@ int tm_set_vfo_bc2(RIG *rig, vfo_t vfo)
         return -RIG_EVFO;
     }
 
-    sprintf(vfobuf, "VMC %d,%d", vfonum, vfomode);
-    retval = kenwood_transaction(rig, vfobuf, NULL, 0);
+    snprintf(cmd, sizeof cmd, "VMC %d,%d", vfonum, vfomode);
+    retval = kenwood_transaction(rig, cmd, cmd, sizeof cmd);
 
     if (retval != RIG_OK)
     {
@@ -691,15 +683,8 @@ int tm_set_vfo_bc2(RIG *rig, vfo_t vfo)
         return RIG_OK;
     }
 
-    sprintf(vfobuf, "BC %d,%d", vfonum, txvfonum);
-    retval = kenwood_transaction(rig, vfobuf, NULL, 0);
-
-    if (retval != RIG_OK)
-    {
-        return retval;
-    }
-
-    return RIG_OK;
+    snprintf(cmd, sizeof cmd, "BC %d,%d", vfonum, txvfonum);
+    return kenwood_transaction(rig, cmd, cmd, sizeof cmd);
 }
 
 
@@ -752,15 +737,15 @@ int th_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t txvfo)
     }
 
     /* Set VFO mode. To be done for TX vfo also? */
-    sprintf(vfobuf, "VMC %d,0", vfonum);
-    retval = kenwood_transaction(rig, vfobuf, NULL, 0);
+    snprintf (vfobuf, sizeof vfobuf, "VMC %d,0", vfonum);
+    retval = kenwood_transaction(rig, vfobuf, vfobuf, sizeof vfobuf);
 
     if (retval != RIG_OK)
     {
         return retval;
     }
 
-    sprintf(vfobuf, "BC %d,%d", vfonum, txvfonum);
+    snprintf (vfobuf, sizeof vfobuf, "BC %d,%d", vfonum, txvfonum);
     retval = kenwood_transaction(rig, vfobuf, NULL, 0);
 
     if (retval != RIG_OK)
@@ -818,8 +803,9 @@ int th_get_split_vfo(RIG *rig, vfo_t vfo, split_t *split, vfo_t *txvfo)
 int
 th_set_trn(RIG *rig, int trn)
 {
-    return kenwood_transaction(rig, (trn == RIG_TRN_RIG) ? "AI 1" : "AI 0", NULL,
-                               0);
+    char buf[5];
+    snprintf (buf, sizeof buf, "AI %c", RIG_TRN_RIG == trn ? '1' : '0');
+    return kenwood_transaction (rig, buf, buf, sizeof buf);
 }
 
 /*
@@ -1411,7 +1397,7 @@ th_set_ctcss_tone(RIG *rig, vfo_t vfo, tone_t tone)
 {
     const struct rig_caps *caps;
     char tonebuf[16];
-    int i, retval;
+    int i;
 
     rig_debug(RIG_DEBUG_TRACE, "%s: called\n", __func__);
 
@@ -1431,15 +1417,8 @@ th_set_ctcss_tone(RIG *rig, vfo_t vfo, tone_t tone)
     }
 
     i += (i == 0) ? 1 : 2;  /* Correct for TH-D7A index anomally */
-    sprintf(tonebuf, "TN %02d", i);
-    retval = kenwood_transaction(rig, tonebuf, NULL, 0);
-
-    if (retval != RIG_OK)
-    {
-        return retval;
-    }
-
-    return RIG_OK;
+    snprintf (tonebuf, sizeof tonebuf, "TN %02d", i);
+    return kenwood_transaction (rig, tonebuf, tonebuf, sizeof tonebuf);
 }
 
 /*
@@ -1496,7 +1475,7 @@ th_set_ctcss_sql(RIG *rig, vfo_t vfo, tone_t tone)
 {
     const struct rig_caps *caps;
     char tonebuf[16];
-    int i, retval;
+    int i;
 
     rig_debug(RIG_DEBUG_TRACE, "%s: called\n", __func__);
 
@@ -1516,15 +1495,8 @@ th_set_ctcss_sql(RIG *rig, vfo_t vfo, tone_t tone)
     }
 
     i += (i == 0) ? 1 : 2;  /* Correct for TH-D7A index anomally */
-    sprintf(tonebuf, "CTN %02d", i);
-    retval = kenwood_transaction(rig, tonebuf, NULL, 0);
-
-    if (retval != RIG_OK)
-    {
-        return retval;
-    }
-
-    return RIG_OK;
+    snprintf (tonebuf, sizeof tonebuf, "CTN %02d", i);
+    return kenwood_transaction (rig, tonebuf, tonebuf, sizeof tonebuf);
 }
 
 /*
@@ -1593,7 +1565,8 @@ th_set_dcs_sql(RIG *rig, vfo_t vfo, tone_t code)
 
     if (code == 0)
     {
-        return kenwood_transaction(rig, "DCS 0", NULL, 0);
+      snprintf (codebuf, sizeof codebuf, "DCS 0");
+        return kenwood_transaction(rig, codebuf, codebuf, sizeof codebuf);
     }
 
     for (i = 0; caps->dcs_list[i] != 0; i++)
@@ -1609,22 +1582,14 @@ th_set_dcs_sql(RIG *rig, vfo_t vfo, tone_t code)
         return -RIG_EINVAL;
     }
 
-    retval = kenwood_transaction(rig, "DCS 1", NULL, 0);
-
-    if (retval != RIG_OK)
+    snprintf (codebuf, sizeof codebuf, "DCS 1");
+    if ((retval = kenwood_transaction(rig, codebuf, codebuf, sizeof codebuf)) != RIG_OK)
     {
         return retval;
     }
 
-    sprintf(codebuf, "DCSN %04d", (i + 1) * 10);
-    retval = kenwood_transaction(rig, codebuf, NULL, 0);
-
-    if (retval != RIG_OK)
-    {
-        return retval;
-    }
-
-    return RIG_OK;
+    snprintf(codebuf, sizeof codebuf, "DCSN %04d", (i + 1) * 10);
+    return kenwood_transaction (rig, codebuf, codebuf, sizeof codebuf);
 }
 
 /*
@@ -1730,7 +1695,7 @@ int
 th_set_mem(RIG *rig, vfo_t vfo, int ch)
 {
     unsigned char vsel;
-    char membuf[10], ackbuf[10];
+    char membuf[10];
     int retval;
     vfo_t tvfo;
 
@@ -1754,23 +1719,13 @@ th_set_mem(RIG *rig, vfo_t vfo, int ch)
         return kenwood_wrong_vfo(__func__, vfo);
     }
 
-    retval = rig_set_vfo(rig, RIG_VFO_MEM);
-
-    if (retval != RIG_OK)
+    if ((retval = rig_set_vfo(rig, RIG_VFO_MEM)) != RIG_OK)
     {
         return retval;
     }
 
-    sprintf(membuf, "MC %c,%03i", vsel, ch);
-
-    retval = kenwood_safe_transaction(rig, membuf, ackbuf, 10, 8);
-
-    if (retval != RIG_OK)
-    {
-        return retval;
-    }
-
-    return RIG_OK;
+    snprintf (membuf, sizeof membuf, "MC %c,%03i", vsel, ch);
+    return kenwood_transaction (rig, membuf, membuf, sizeof membuf);
 }
 
 /* Get mem works only when the display is
@@ -1844,9 +1799,9 @@ th_get_mem(RIG *rig, vfo_t vfo, int *ch)
 int
 th_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt)
 {
+    char buf[3];
     rig_debug(RIG_DEBUG_TRACE, "%s: called\n", __func__);
-
-    return kenwood_transaction(rig, (ptt == RIG_PTT_ON) ? "TX" : "RX", NULL, 0);
+    return kenwood_transaction(rig, (ptt == RIG_PTT_ON) ? "TX" : "RX", buf, sizeof buf);
 }
 
 int th_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd)
@@ -2482,7 +2437,7 @@ int th_set_channel(RIG *rig, const channel_t *chan)
                );
     }
 
-    retval = kenwood_transaction(rig, membuf, NULL, 0);
+    retval = kenwood_transaction(rig, membuf, membuf, sizeof membuf);
 
     if (retval != RIG_OK)
     {
@@ -2498,7 +2453,7 @@ int th_set_channel(RIG *rig, const channel_t *chan)
         req[3 + strlen(mr_extra)] = '1';
 
         sprintf(membuf, "%s,%011"PRIll",%X", req, (int64_t)chan->tx_freq, step);
-        retval = kenwood_transaction(rig, membuf, NULL, 0);
+        retval = kenwood_transaction(rig, membuf, membuf, sizeof membuf);
 
         if (retval != RIG_OK)
         {
@@ -2519,7 +2474,7 @@ int th_set_channel(RIG *rig, const channel_t *chan)
             sprintf(membuf, "MNA %s%03d,%s", mr_extra, channel_num, channel_desc);
         }
 
-        retval = kenwood_transaction(rig, membuf, NULL, 0);
+        retval = kenwood_transaction(rig, membuf, membuf, sizeof membuf);
 
         if (retval != RIG_OK)
         {
@@ -2535,29 +2490,29 @@ int th_set_channel(RIG *rig, const channel_t *chan)
  */
 int th_set_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t option)
 {
-    const char *cmd;
+    char cmd[6];
 
     rig_debug(RIG_DEBUG_TRACE, "%s: ant = %d\n", __func__, ant);
 
     switch (ant)
     {
     case RIG_ANT_1:
-        cmd = "ANT 0";
+        strncpy (cmd, "ANT 0", sizeof cmd);
         break;
 
     case RIG_ANT_2:
-        cmd = "ANT 1";
+        strncpy (cmd, "ANT 1", sizeof cmd);
         break;
 
     case RIG_ANT_3:
-        cmd = "ANT 2";
+        strncpy (cmd, "ANT 2", sizeof cmd);
         break;
 
     default:
         return -RIG_EINVAL;
     }
 
-    return kenwood_transaction(rig, cmd, NULL, 0);
+    return kenwood_transaction(rig, cmd, cmd, sizeof cmd);
 }
 
 
diff --git a/rigs/kenwood/th.h b/rigs/kenwood/th.h
index a8346cf1a..62161ac77 100644
--- a/rigs/kenwood/th.h
+++ b/rigs/kenwood/th.h
@@ -23,7 +23,7 @@
 
 #include "idx_builtin.h"
 
-#define TH_VER "20200212"
+#define TH_VER "20200701"
 
 extern int th_transaction (RIG *rig, const char *cmdstr, char *data, size_t datasize);
 extern int th_get_vfo_char(RIG *rig, vfo_t *vfo, char *vfoch);
diff --git a/rigs/kenwood/thd7.c b/rigs/kenwood/thd7.c
index 7305aba7f..205afe274 100644
--- a/rigs/kenwood/thd7.c
+++ b/rigs/kenwood/thd7.c
@@ -88,7 +88,7 @@ const struct rig_caps thd7a_caps =
     .mfg_name =  "Kenwood",
     .version =  TH_VER ".0",
     .copyright =  "LGPL",
-    .status =  RIG_STATUS_ALPHA,
+    .status =  RIG_STATUS_BETA,
     .rig_type =  RIG_TYPE_HANDHELD | RIG_FLAG_APRS | RIG_FLAG_TNC | RIG_FLAG_DXCLUSTER,
     .ptt_type =  RIG_PTT_RIG,
     .dcd_type =  RIG_DCD_RIG,
@@ -195,7 +195,7 @@ const struct rig_caps thd7a_caps =
     .get_parm =  th_get_parm,
     .get_info =  th_get_info,
 
-    .get_dcd =  kenwood_get_dcd,
+    .get_dcd =  th_get_dcd,
 
     .decode_event =  th_decode_event,
 };