diff --git a/src/isdn/Makefile.am b/src/isdn/Makefile.am
index 2aed0bf..3bb7b04 100644
--- a/src/isdn/Makefile.am
+++ b/src/isdn/Makefile.am
@@ -13,7 +13,7 @@
 noinst_LTLIBRARIES = libisdnint.la
 lib_LTLIBRARIES = libosmoisdn.la
 
-libisdnint_la_SOURCES = i460_mux.c lapd_core.c
+libisdnint_la_SOURCES = i460_mux.c lapd_core.c v110.c
 
 libisdnint_la_LDFLAGS = -no-undefined
 libisdnint_la_LIBADD = $(top_builddir)/src/core/libosmocore.la
diff --git a/src/isdn/libosmoisdn.map b/src/isdn/libosmoisdn.map
index 5ac65c9..3269771 100644
--- a/src/isdn/libosmoisdn.map
+++ b/src/isdn/libosmoisdn.map
@@ -21,5 +21,14 @@
 osmo_i460_subchan_count;
 osmo_i460_ts_init;
 
+osmo_v110_decode_frame;
+osmo_v110_encode_frame;
+osmo_v110_ubit_dump;
+osmo_v110_sync_ra1_get_user_data_chunk_bitlen;
+osmo_v110_sync_ra1_get_user_data_rate;
+osmo_v110_sync_ra1_get_intermediate_rate;
+osmo_v110_sync_ra1_user_to_ir;
+osmo_v110_sync_ra1_ir_to_user;
+
 local: *;
 };
diff --git a/src/isdn/v110.c b/src/isdn/v110.c
new file mode 100644
index 0000000..4d13547
--- /dev/null
+++ b/src/isdn/v110.c
@@ -0,0 +1,582 @@
+/* V.110 frames according to ITU-T V.110
+ *
+ * This code implements the following functionality:
+ * - parsing/encoding of osmo_v110_decoded_frame from/to actual 80-bit V.110 frame
+ * - synchronous rate adapting of user bit rate to V.110 D-bits as per Table 6
+ *
+ * It is (at least initially) a very "naive" implementation, as it first and foremost
+ * aims to be functional and correct, rather than efficient in any way.  Hence it
+ * operates on unpacked bits (ubit_t, 1 bit per byte), and has various intermediate
+ * representations and indirect function calls.  If needed, a more optimized variant
+ * can always be developed later on.
+ */
+
+/* (C) 2022 by Harald Welte <laforge@osmocom.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ */
+
+#include <stdint.h>
+#include <errno.h>
+
+#include <osmocom/core/bits.h>
+
+#include <osmocom/isdn/v110.h>
+
+/*************************************************************************
+ * V.110 frame decoding/encoding (ubits <-> struct with D/S/X/E bits)
+ *************************************************************************/
+
+/*! Decode a 80-bit V.110 frame present as 80 ubits into a struct osmo_v110_decoded_frame.
+ *  \param[out] fr caller-allocated output data structure, filled by this function
+ *  \param[in] ra_bits One V.110 frame as 80 unpacked bits.
+ *  \param[in] n_bits number of unpacked bits provided in ra_bits
+ *  \returns 0 in case of success; negative on error. */
+int osmo_v110_decode_frame(struct osmo_v110_decoded_frame *fr, const ubit_t *ra_bits, size_t n_bits)
+{
+	if (n_bits < 80)
+		return -EINVAL;
+
+	/* X1 .. X2 */
+	fr->x_bits[0] = ra_bits[2 * 8 + 7];
+	fr->x_bits[1] = ra_bits[7 * 8 + 7];
+
+	/* S1, S3, S4, S6, S8, S9 */
+	fr->s_bits[0] = ra_bits[1 * 8 + 7];
+	fr->s_bits[2] = ra_bits[3 * 8 + 7];
+	fr->s_bits[3] = ra_bits[4 * 8 + 7];
+	fr->s_bits[5] = ra_bits[6 * 8 + 7];
+	fr->s_bits[7] = ra_bits[8 * 8 + 7];
+	fr->s_bits[8] = ra_bits[9 * 8 + 7];
+
+	/* E1 .. E7 */
+	memcpy(fr->e_bits, ra_bits + 5 * 8 + 1, 7);
+
+	/* D-bits */
+	memcpy(fr->d_bits + 0 * 6, ra_bits + 1 * 8 + 1, 6);
+	memcpy(fr->d_bits + 1 * 6, ra_bits + 2 * 8 + 1, 6);
+	memcpy(fr->d_bits + 2 * 6, ra_bits + 3 * 8 + 1, 6);
+	memcpy(fr->d_bits + 3 * 6, ra_bits + 4 * 8 + 1, 6);
+
+	memcpy(fr->d_bits + 4 * 6, ra_bits + 6 * 8 + 1, 6);
+	memcpy(fr->d_bits + 5 * 6, ra_bits + 7 * 8 + 1, 6);
+	memcpy(fr->d_bits + 6 * 6, ra_bits + 8 * 8 + 1, 6);
+	memcpy(fr->d_bits + 7 * 6, ra_bits + 9 * 8 + 1, 6);
+
+	return 0;
+}
+
+/*! Encode a struct osmo_v110_decoded_frame into an 80-bit V.110 frame as ubits.
+ *  \param[out] ra_bits caller-provided output buffer at leat 80 ubits large
+ *  \param[in] n_bits length of ra_bits. Must be at least 80.
+ *  \param[in] input data structure
+ *  \returns number of bits written to ra_bits */
+int osmo_v110_encode_frame(ubit_t *ra_bits, size_t n_bits, const struct osmo_v110_decoded_frame *fr)
+{
+	if (n_bits < 80)
+		return -ENOSPC;
+
+	/* alignment pattern */
+	memset(ra_bits+0, 0, 8);
+	for (int i = 1; i < 10; i++)
+		ra_bits[i*8] = 1;
+
+	/* X1 .. X2 */
+	ra_bits[2 * 8 + 7] = fr->x_bits[0];
+	ra_bits[7 * 8 + 7] = fr->x_bits[1];
+
+	/* S1, S3, S4, S6, S8, S9 */
+	ra_bits[1 * 8 + 7] = fr->s_bits[0];
+	ra_bits[3 * 8 + 7] = fr->s_bits[2];
+	ra_bits[4 * 8 + 7] = fr->s_bits[3];
+	ra_bits[6 * 8 + 7] = fr->s_bits[5];
+	ra_bits[8 * 8 + 7] = fr->s_bits[7];
+	ra_bits[9 * 8 + 7] = fr->s_bits[8];
+
+	/* E1 .. E7 */
+	memcpy(ra_bits + 5 * 8 + 1, fr->e_bits, 7);
+
+	/* D-bits */
+	memcpy(ra_bits + 1 * 8 + 1, fr->d_bits + 0 * 6, 6);
+	memcpy(ra_bits + 2 * 8 + 1, fr->d_bits + 1 * 6, 6);
+	memcpy(ra_bits + 3 * 8 + 1, fr->d_bits + 2 * 6, 6);
+	memcpy(ra_bits + 4 * 8 + 1, fr->d_bits + 3 * 6, 6);
+
+	memcpy(ra_bits + 6 * 8 + 1, fr->d_bits + 4 * 6, 6);
+	memcpy(ra_bits + 7 * 8 + 1, fr->d_bits + 5 * 6, 6);
+	memcpy(ra_bits + 8 * 8 + 1, fr->d_bits + 6 * 6, 6);
+	memcpy(ra_bits + 9 * 8 + 1, fr->d_bits + 7 * 6, 6);
+
+	return 10 * 8;
+}
+
+/*! Print a encoded V.110 frame in the same table-like structure as the spec.
+ *  \param outf output FILE stream to which to dump
+ *  \param[in] fr unpacked bits to dump
+ *  \param[in] in_len length of unpacked bits available at fr. */
+void osmo_v110_ubit_dump(FILE *outf, const ubit_t *fr, size_t in_len)
+{
+	if (in_len < 80)
+		fprintf(outf, "short input data\n");
+
+	for (unsigned int octet = 0; octet < 10; octet++) {
+		fprintf(outf, "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
+			fr[octet * 8 + 0], fr[octet * 8 + 1], fr[octet * 8 + 2], fr[octet * 8 + 3],
+			fr[octet * 8 + 4], fr[octet * 8 + 5], fr[octet * 8 + 6], fr[octet * 8 + 7]);
+	}
+}
+
+/*************************************************************************
+ * RA1 synchronous rate adaptation
+ *************************************************************************/
+
+/* I actually couldn't find any reference as to the value of F(ill) bits */
+#define F 1
+
+/*! Adapt from 6 synchronous 600bit/s input bits to a decoded V.110 frame.
+ *  \param[out] fr caller-allocated output frame to which E+D bits are stored
+ *  \param[in] d_in input user bits
+ *  \param[in] in_len number of bits in d_in. Must be 6.
+ *  \returns 0 on success; negative in case of error. */
+static int v110_adapt_600_to_IR8000(struct osmo_v110_decoded_frame *fr, const ubit_t *d_in, size_t in_len)
+{
+	if (in_len != 6)
+		return -EINVAL;
+
+	/* Table 6a / V.110 */
+	fr->e_bits[0] = 1;
+	fr->e_bits[1] = 0;
+	fr->e_bits[2] = 0;
+	for (int i = 0; i < 6; i++)
+		memset(fr->d_bits + i*8, d_in[i], 8);
+
+	return 0;
+}
+
+static int v110_adapt_IR8000_to_600(ubit_t *d_out, size_t out_len, const struct osmo_v110_decoded_frame *fr)
+{
+	if (out_len < 6)
+		return -ENOSPC;
+
+	if (fr->e_bits[0] != 1 || fr->e_bits[1] != 0 || fr->e_bits[2] != 0)
+		return -EINVAL;
+
+	for (int i = 0; i < 6; i++) {
+		/* we only use one of the bits, not some kind of consistency check or majority vote */
+		d_out[i] = fr->d_bits[i*8];
+	}
+
+	return 6;
+}
+
+/*! Adapt from 12 synchronous 1200bit/s input bits to a decoded V.110 frame.
+ *  \param[out] fr caller-allocated output frame to which E+D bits are stored
+ *  \param[in] d_in input user bits
+ *  \param[in] in_len number of bits in d_in. Must be 12.
+ *  \returns 0 on success; negative in case of error. */
+static int v110_adapt_1200_to_IR8000(struct osmo_v110_decoded_frame *fr, const ubit_t *d_in, size_t in_len)
+{
+	if (in_len != 12)
+		return -EINVAL;
+
+	/* Table 6b / V.110 */
+	fr->e_bits[0] = 0;
+	fr->e_bits[1] = 1;
+	fr->e_bits[2] = 0;
+	for (int i = 0; i < 12; i++)
+		memset(fr->d_bits + i*4, d_in[i], 4);
+
+	return 0;
+}
+
+static int v110_adapt_IR8000_to_1200(ubit_t *d_out, size_t out_len, const struct osmo_v110_decoded_frame *fr)
+{
+	if (out_len < 12)
+		return -ENOSPC;
+
+	if (fr->e_bits[0] != 0 || fr->e_bits[1] != 1 || fr->e_bits[2] != 0)
+		return -EINVAL;
+
+	for (int i = 0; i < 12; i++) {
+		/* we only use one of the bits, not some kind of consistency check or majority vote */
+		d_out[i] = fr->d_bits[i*4];
+	}
+
+	return 12;
+}
+
+/*! Adapt from 24 synchronous 2400bit/s input bits to a decoded V.110 frame.
+ *  \param[out] fr caller-allocated output frame to which E+D bits are stored
+ *  \param[in] d_in input user bits
+ *  \param[in] in_len number of bits in d_in. Must be 24.
+ *  \returns 0 on success; negative in case of error. */
+static int v110_adapt_2400_to_IR8000(struct osmo_v110_decoded_frame *fr, const ubit_t *d_in, size_t in_len)
+{
+	if (in_len != 24)
+		return -EINVAL;
+
+	/* Table 6c / V.110 */
+	fr->e_bits[0] = 1;
+	fr->e_bits[1] = 1;
+	fr->e_bits[2] = 0;
+	for (int i = 0; i < 24; i++) {
+		fr->d_bits[i*2 + 0] = d_in[i];
+		fr->d_bits[i*2 + 1] = d_in[i];
+	}
+
+	return 0;
+}
+
+static int v110_adapt_IR8000_to_2400(ubit_t *d_out, size_t out_len, const struct osmo_v110_decoded_frame *fr)
+{
+	if (out_len < 24)
+		return -ENOSPC;
+
+	if (fr->e_bits[1] != 1 || fr->e_bits[1] != 1 || fr->e_bits[2] != 0)
+		return -EINVAL;
+
+	for (int i = 0; i < 24; i++) {
+		/* we only use one of the bits, not some kind of consistency check or majority vote */
+		d_out[i] = fr->d_bits[i*2];
+	}
+
+	return 24;
+}
+
+/*! Adapt from 36 synchronous N x 3600bit/s input bits to a decoded V.110 frame.
+ *  \param[out] fr caller-allocated output frame to which E+D bits are stored
+ *  \param[in] d_in input user bits
+ *  \param[in] in_len number of bits in d_in. Must be 36.
+ *  \returns 0 on success; negative in case of error. */
+static int v110_adapt_Nx3600_to_IR(struct osmo_v110_decoded_frame *fr, const ubit_t *d_in, size_t in_len)
+{
+	int d_idx = 0;
+
+	if (in_len != 36)
+		return -EINVAL;
+
+	/* Table 6d / V.110 */
+	fr->e_bits[0] = 1;
+	fr->e_bits[1] = 0;
+	fr->e_bits[2] = 1;
+
+	memcpy(fr->d_bits + d_idx, d_in + 0, 10); d_idx += 10;	/* D1..D10 */
+	memset(fr->d_bits + d_idx, F, 2); d_idx += 2;
+	memcpy(fr->d_bits + d_idx, d_in + 10, 2); d_idx += 2;	/* D11..D12 */
+	memset(fr->d_bits + d_idx, F, 2); d_idx += 2;
+	memcpy(fr->d_bits + d_idx, d_in + 12, 2); d_idx += 2;	/* D13..D14 */
+	memset(fr->d_bits + d_idx, F, 2); d_idx += 2;
+	memcpy(fr->d_bits + d_idx, d_in + 14, 14); d_idx += 14;	/* D15..D28 */
+	memset(fr->d_bits + d_idx, F, 2); d_idx += 2;
+	memcpy(fr->d_bits + d_idx, d_in + 28, 2); d_idx += 2;	/* D29..D30 */
+	memset(fr->d_bits + d_idx, F, 2); d_idx += 2;
+	memcpy(fr->d_bits + d_idx, d_in + 30, 2); d_idx += 2;	/* D31..D32 */
+	memset(fr->d_bits + d_idx, F, 2); d_idx += 2;
+	memcpy(fr->d_bits + d_idx, d_in + 32, 4); d_idx += 4;	/* D33..D36 */
+
+	OSMO_ASSERT(d_idx == 48);
+
+	return 0;
+}
+
+static int v110_adapt_IR_to_Nx3600(ubit_t *d_out, size_t out_len, const struct osmo_v110_decoded_frame *fr)
+{
+	int d_idx = 0;
+
+	if (out_len < 36)
+		return -ENOSPC;
+
+	if (fr->e_bits[0] != 1 || fr->e_bits[1] != 0 || fr->e_bits[2] != 1)
+		return -EINVAL;
+
+	memcpy(d_out + 0, fr->d_bits + d_idx, 10); d_idx += 10;	/* D1..D10 */
+	d_idx += 2;
+	memcpy(d_out + 10, fr->d_bits + d_idx, 2); d_idx += 2;	/* D11..D12 */
+	d_idx += 2;
+	memcpy(d_out + 12, fr->d_bits + d_idx, 2); d_idx += 2;	/* D13..D14 */
+	d_idx += 2;
+	memcpy(d_out + 14, fr->d_bits + d_idx, 14); d_idx += 14;/* D15..D28 */
+	d_idx += 2;
+	memcpy(d_out + 28, fr->d_bits + d_idx, 2); d_idx += 2;	/* D29..D30 */
+	d_idx += 2;
+	memcpy(d_out + 30, fr->d_bits + d_idx, 2); d_idx += 2;	/* D31..D32 */
+	d_idx += 2;
+	memcpy(d_out + 32, fr->d_bits + d_idx, 4); d_idx += 4;	/* D33..D36 */
+
+	OSMO_ASSERT(d_idx == 48);
+
+	return 36;
+}
+
+
+/*! Adapt from 48 synchronous N x 4800bit/s input bits to a decoded V.110 frame.
+ *  \param[out] fr caller-allocated output frame to which E+D bits are stored
+ *  \param[in] d_in input user bits
+ *  \param[in] in_len number of bits in d_in. Must be 48.
+ *  \returns 0 on success; negative in case of error. */
+static int v110_adapt_Nx4800_to_IR(struct osmo_v110_decoded_frame *fr, const ubit_t *d_in, size_t in_len)
+{
+	if (in_len != 48)
+		return -EINVAL;
+
+	/* Table 6e / V.110 */
+	fr->e_bits[0] = 0;
+	fr->e_bits[1] = 1;
+	fr->e_bits[2] = 1;
+
+	memcpy(fr->d_bits, d_in, 48);
+
+	return 0;
+}
+
+static int v110_adapt_IR_to_Nx4800(ubit_t *d_out, size_t out_len, const struct osmo_v110_decoded_frame *fr)
+{
+	if (out_len < 48)
+		return -ENOSPC;
+
+	if (fr->e_bits[0] != 0 || fr->e_bits[1] != 1 || fr->e_bits[2] != 1)
+		return -EINVAL;
+
+	memcpy(d_out, fr->d_bits, 48);
+
+	return 48;
+}
+
+/*! Adapt from 30 synchronous N x 12000bit/s input bits to a decoded V.110 frame.
+ *  \param[out] fr caller-allocated output frame to which E+D bits are stored
+ *  \param[in] d_in input user bits
+ *  \param[in] in_len number of bits in d_in. Must be 30.
+ *  \returns 0 on success; negative in case of error. */
+static int v110_adapt_Nx12000_to_IR(struct osmo_v110_decoded_frame *fr, const ubit_t *d_in, size_t in_len)
+{
+	int d_idx = 0;
+
+	if (in_len != 30)
+		return -EINVAL;
+
+	/* Table 6f / V.110 */
+	fr->e_bits[0] = 0;
+	fr->e_bits[1] = 0;
+	fr->e_bits[2] = 1;
+
+	memcpy(fr->d_bits + d_idx, d_in + 0, 10); d_idx += 10;	/* D1..D10 */
+	memset(fr->d_bits + d_idx, F, 2); d_idx += 2;
+	memcpy(fr->d_bits + d_idx, d_in + 10, 2); d_idx += 2;	/* D11..D12 */
+	memset(fr->d_bits + d_idx, F, 2); d_idx += 2;
+	memcpy(fr->d_bits + d_idx, d_in + 12, 2); d_idx += 2;	/* D13..D14 */
+	memset(fr->d_bits + d_idx, F, 2); d_idx += 2;
+	fr->d_bits[d_idx++] = d_in[14];				/* D15 */
+	memset(fr->d_bits + d_idx, F, 3); d_idx += 3;
+	memcpy(fr->d_bits + d_idx, d_in + 15, 10); d_idx += 10;	/* D16..D25 */
+	memset(fr->d_bits + d_idx, F, 2); d_idx += 2;
+	memcpy(fr->d_bits + d_idx, d_in + 25, 2); d_idx += 2;	/* D26..D27 */
+	memset(fr->d_bits + d_idx, F, 2); d_idx += 2;
+	memcpy(fr->d_bits + d_idx, d_in + 27, 2); d_idx += 2;	/* D28..D29 */
+	memset(fr->d_bits + d_idx, F, 2); d_idx += 2;
+	fr->d_bits[d_idx++] = d_in[29];				/* D30 */
+	memset(fr->d_bits + d_idx, F, 3); d_idx += 3;
+
+	OSMO_ASSERT(d_idx == 48);
+
+	return 0;
+}
+
+static int v110_adapt_IR_to_Nx12000(ubit_t *d_out, size_t out_len, const struct osmo_v110_decoded_frame *fr)
+{
+	int d_idx = 0;
+
+	if (out_len < 30)
+		return -ENOSPC;
+
+	if (fr->e_bits[0] != 0 || fr->e_bits[1] != 0 || fr->e_bits[2] != 1)
+		return -EINVAL;
+
+	memcpy(d_out + 0, fr->d_bits + d_idx, 10); d_idx += 10;	/* D1..D10 */
+	d_idx += 2;
+	memcpy(d_out + 10, fr->d_bits + d_idx, 2); d_idx += 2;	/* D11..D12 */
+	d_idx += 2;
+	memcpy(d_out + 12, fr->d_bits + d_idx, 2); d_idx += 2;	/* D13..D14 */
+	d_idx += 2;
+	d_out[14] = fr->d_bits[d_idx++];			/* D15 */
+	d_idx += 3;
+	memcpy(d_out + 15, fr->d_bits + d_idx, 10); d_idx += 10;/* D16..D25 */
+	d_idx += 2;
+	memcpy(d_out + 25, fr->d_bits + d_idx, 2); d_idx += 2;	/* D26..D27 */
+	d_idx += 2;
+	memcpy(d_out + 27, fr->d_bits + d_idx, 2); d_idx += 2;	/* D28..D29 */
+	d_idx += 2;
+	d_out[29] = fr->d_bits[d_idx++];			/* D30 */
+	d_idx += 3;
+
+	OSMO_ASSERT(d_idx == 48);
+
+	return 30;
+}
+
+/* definition of a synchronous V.110 RA1 rate adaptation. There is one for each supported tuple
+ * of user data rate and intermediate rate (IR). */
+struct osmo_v110_sync_ra1 {
+	unsigned int data_rate;
+	unsigned int intermediate_rate;
+	unsigned int user_data_chunk_bits;
+	/*! RA1 function in user bitrate -> intermediate rate direction */
+	int (*adapt_user_to_ir)(struct osmo_v110_decoded_frame *fr, const ubit_t *d_in, size_t in_len);
+	/*! RA1 function in intermediate rate -> user bitrate direction */
+	int (*adapt_ir_to_user)(ubit_t *d_out, size_t out_len, const struct osmo_v110_decoded_frame *fr);
+};
+
+/* all of the synchronous data signalling rates; see Table 1/V.110 */
+static const struct osmo_v110_sync_ra1 osmo_v110_sync_ra1_def[_NUM_OSMO_V110_SYNC_RA1] = {
+	[OSMO_V110_SYNC_RA1_600] = {
+		.data_rate = 600,
+		.intermediate_rate = 8000,
+		.user_data_chunk_bits = 6,
+		.adapt_user_to_ir = v110_adapt_600_to_IR8000,
+		.adapt_ir_to_user = v110_adapt_IR8000_to_600,
+	},
+	[OSMO_V110_SYNC_RA1_1200] = {
+		.data_rate = 1200,
+		.intermediate_rate = 8000,
+		.user_data_chunk_bits = 12,
+		.adapt_user_to_ir = v110_adapt_1200_to_IR8000,
+		.adapt_ir_to_user = v110_adapt_IR8000_to_1200,
+	},
+	[OSMO_V110_SYNC_RA1_2400] = {
+		.data_rate = 2400,
+		.intermediate_rate = 8000,
+		.user_data_chunk_bits = 24,
+		.adapt_user_to_ir = v110_adapt_2400_to_IR8000,
+		.adapt_ir_to_user = v110_adapt_IR8000_to_2400,
+	},
+	[OSMO_V110_SYNC_RA1_4800] = {
+		.data_rate = 4800,
+		.intermediate_rate = 8000,
+		.user_data_chunk_bits = 48,
+		.adapt_user_to_ir = v110_adapt_Nx4800_to_IR,
+		.adapt_ir_to_user = v110_adapt_IR_to_Nx4800,
+	},
+	[OSMO_V110_SYNC_RA1_7200] = {
+		.data_rate = 7200,
+		.intermediate_rate = 16000,
+		.user_data_chunk_bits = 36,
+		.adapt_user_to_ir = v110_adapt_Nx3600_to_IR,
+		.adapt_ir_to_user = v110_adapt_IR_to_Nx3600,
+	},
+	[OSMO_V110_SYNC_RA1_9600] = {
+		.data_rate = 9600,
+		.intermediate_rate = 16000,
+		.user_data_chunk_bits = 48,
+		.adapt_user_to_ir = v110_adapt_Nx4800_to_IR,
+		.adapt_ir_to_user = v110_adapt_IR_to_Nx4800,
+	},
+	[OSMO_V110_SYNC_RA1_12000] = {
+		.data_rate = 12000,
+		.intermediate_rate = 32000,
+		.user_data_chunk_bits = 30,
+		.adapt_user_to_ir = v110_adapt_Nx12000_to_IR,
+		.adapt_ir_to_user = v110_adapt_IR_to_Nx12000,
+	},
+	[OSMO_V110_SYNC_RA1_14400] = {
+		.data_rate = 14400,
+		.intermediate_rate = 32000,
+		.user_data_chunk_bits = 36,
+		.adapt_user_to_ir = v110_adapt_Nx3600_to_IR,
+		.adapt_ir_to_user = v110_adapt_IR_to_Nx3600,
+	},
+	[OSMO_V110_SYNC_RA1_19200] = {
+		.data_rate = 19200,
+		.intermediate_rate = 32000,
+		.user_data_chunk_bits = 48,
+		.adapt_user_to_ir = v110_adapt_Nx4800_to_IR,
+		.adapt_ir_to_user = v110_adapt_IR_to_Nx4800,
+	},
+	[OSMO_V110_SYNC_RA1_24000] = {
+		.data_rate = 24000,
+		.intermediate_rate = 64000,
+		.user_data_chunk_bits = 30,
+		.adapt_user_to_ir = v110_adapt_Nx12000_to_IR,
+		.adapt_ir_to_user = v110_adapt_IR_to_Nx12000,
+	},
+	[OSMO_V110_SYNC_RA1_28800] = {
+		.data_rate = 28800,
+		.intermediate_rate = 64000,
+		.user_data_chunk_bits = 36,
+		.adapt_user_to_ir = v110_adapt_Nx3600_to_IR,
+		.adapt_ir_to_user = v110_adapt_IR_to_Nx3600,
+	},
+	[OSMO_V110_SYNC_RA1_38400] = {
+		.data_rate = 38400,
+		.intermediate_rate = 64000,
+		.user_data_chunk_bits = 48,
+		.adapt_user_to_ir = v110_adapt_Nx4800_to_IR,
+		.adapt_ir_to_user = v110_adapt_IR_to_Nx4800,
+	},
+};
+
+/*! obtain the size (in number of bits) of the user data bits in one V.110
+ *  frame for specified RA1 rate */
+int osmo_v110_sync_ra1_get_user_data_chunk_bitlen(enum osmo_v100_sync_ra1_rate rate)
+{
+	if (rate < 0 || rate >= _NUM_OSMO_V110_SYNC_RA1)
+		return -EINVAL;
+
+	return osmo_v110_sync_ra1_def[rate].user_data_chunk_bits;
+}
+
+/*! obtain the user data rate (in bits/s) for specified RA1 rate */
+int osmo_v110_sync_ra1_get_user_data_rate(enum osmo_v100_sync_ra1_rate rate)
+{
+	if (rate < 0 || rate >= _NUM_OSMO_V110_SYNC_RA1)
+		return -EINVAL;
+
+	return osmo_v110_sync_ra1_def[rate].data_rate;
+}
+
+/*! obtain the intermediate rate (in bits/s) for specified RA1 rate */
+int osmo_v110_sync_ra1_get_intermediate_rate(enum osmo_v100_sync_ra1_rate rate)
+{
+	if (rate < 0 || rate >= _NUM_OSMO_V110_SYNC_RA1)
+		return -EINVAL;
+
+	return osmo_v110_sync_ra1_def[rate].intermediate_rate;
+}
+
+/*! perform V.110 RA1 function in user rate -> intermediate rate direction.
+ *  \param[in] rate specification of the user bitrate
+ *  \param[out] fr caller-allocated output buffer for the [decoded] V.110 frame generated
+ *  \param[in] d_in input user data (unpacked bits)
+ *  \param[in] in_len length of user input data (in number of bits)
+ *  \returns 0 on success; negative in case of error */
+int osmo_v110_sync_ra1_user_to_ir(enum osmo_v100_sync_ra1_rate rate, struct osmo_v110_decoded_frame *fr,
+				  const ubit_t *d_in, size_t in_len)
+{
+	if (rate < 0 || rate >= _NUM_OSMO_V110_SYNC_RA1)
+		return -EINVAL;
+
+	return osmo_v110_sync_ra1_def[rate].adapt_user_to_ir(fr, d_in, in_len);
+}
+
+/*! perform V.110 RA1 function in intermediate rate -> user rate direction.
+ *  \param[in] rate specification of the user bitrate
+ *  \param[out] d_out caller-allocated output user data (unpacked bits)
+ *  \param[out] out_len length of d_out output buffer
+ *  \param[in] fr [decoded] V.110 frame used as input
+ *  \returns number of unpacked bits written to d_out on success; negative in case of error */
+int osmo_v110_sync_ra1_ir_to_user(enum osmo_v100_sync_ra1_rate rate, ubit_t *d_out, size_t out_len,
+				  const struct osmo_v110_decoded_frame *fr)
+{
+	if (rate < 0 || rate >= _NUM_OSMO_V110_SYNC_RA1)
+		return -EINVAL;
+
+	return osmo_v110_sync_ra1_def[rate].adapt_ir_to_user(d_out, out_len, fr);
+}
