diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h
index 1b4720f..8f24d4f 100644
--- a/openbsc/include/openbsc/gsm_data.h
+++ b/openbsc/include/openbsc/gsm_data.h
@@ -435,5 +435,6 @@
 
 /* control interface handling */
 int bsc_base_ctrl_cmds_install(void);
+int msc_ctrl_cmds_install(void);
 
 #endif /* _GSM_DATA_H */
diff --git a/openbsc/src/libmsc/Makefile.am b/openbsc/src/libmsc/Makefile.am
index 1e58cd1..24db2c2 100644
--- a/openbsc/src/libmsc/Makefile.am
+++ b/openbsc/src/libmsc/Makefile.am
@@ -17,7 +17,7 @@
 			ussd.c \
 			vty_interface_layer3.c \
 			transaction.c \
-			osmo_msc.c
+			osmo_msc.c ctrl_commands.c
 
 if BUILD_SMPP
 noinst_HEADERS = smpp_smsc.h
diff --git a/openbsc/src/libmsc/ctrl_commands.c b/openbsc/src/libmsc/ctrl_commands.c
new file mode 100644
index 0000000..75b094a
--- /dev/null
+++ b/openbsc/src/libmsc/ctrl_commands.c
@@ -0,0 +1,106 @@
+/*
+ * (C) 2014 by Holger Hans Peter Freyther
+ * (C) 2014 by sysmocom s.f.m.c. GmbH
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+#include <openbsc/control_cmd.h>
+#include <openbsc/gsm_data.h>
+#include <openbsc/gsm_subscriber.h>
+#include <openbsc/db.h>
+
+static int verify_subscriber_modify(struct ctrl_cmd *cmd, const char *value, void *d)
+{
+	char *tmp, *imsi, *msisdn, *saveptr = NULL;
+
+	tmp = talloc_strdup(cmd, value);
+	if (!tmp)
+		return 1;
+
+	imsi = strtok_r(tmp, ",", &saveptr);
+	msisdn = strtok_r(NULL, ",", &saveptr);
+	talloc_free(tmp);
+
+	if (!imsi || !msisdn)
+		return 1;
+	if (strlen(imsi) >= GSM_IMSI_LENGTH)
+		return 1;
+	if (strlen(msisdn) >= GSM_EXTENSION_LENGTH)
+		return 1;
+	return 0;
+}
+
+static int get_subscriber_modify(struct ctrl_cmd *cmd, void *data)
+{
+	cmd->reply = "Set only attribute";
+	return CTRL_CMD_ERROR;
+}
+
+static int set_subscriber_modify(struct ctrl_cmd *cmd, void *data)
+{
+	struct gsm_network *net = cmd->node;
+	char *tmp, *imsi, *msisdn, *saveptr = NULL;
+	struct gsm_subscriber* subscr;
+	int rc;
+
+	tmp = talloc_strdup(cmd, cmd->value);
+	if (!tmp)
+		return 1;
+
+	imsi = strtok_r(tmp, ",", &saveptr);
+	msisdn = strtok_r(NULL, ",", &saveptr);
+
+	subscr = subscr_get_by_imsi(net, imsi);
+	if (!subscr)
+		subscr = subscr_create_subscriber(net, imsi);
+	if (!subscr)
+		goto fail;
+
+	subscr->authorized = 1;
+	strncpy(subscr->extension, msisdn, GSM_EXTENSION_LENGTH - 1);
+	subscr->extension[GSM_EXTENSION_LENGTH-1] = '\0';
+
+	/* put it back to the db */
+	rc = db_sync_subscriber(subscr);
+	db_subscriber_update(subscr);
+	subscr_put(subscr);
+
+	talloc_free(tmp);
+
+	if (rc != 0) {
+		cmd->reply = "Failed to store the record in the DB";
+		return CTRL_CMD_ERROR;
+	}
+
+	cmd->reply = "OK";
+	return CTRL_CMD_REPLY;
+
+fail:
+	talloc_free(tmp);
+	cmd->reply = "Failed to create subscriber";
+	return CTRL_CMD_ERROR;
+}
+
+CTRL_CMD_DEFINE(subscriber_modify, "subscriber-modify-v1");
+
+int msc_ctrl_cmds_install(void)
+{
+	int rc = 0;
+
+	rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_subscriber_modify);
+	return rc;
+}
diff --git a/openbsc/src/osmo-nitb/bsc_hack.c b/openbsc/src/osmo-nitb/bsc_hack.c
index 67c65ce..c78e3ec 100644
--- a/openbsc/src/osmo-nitb/bsc_hack.c
+++ b/openbsc/src/osmo-nitb/bsc_hack.c
@@ -291,7 +291,12 @@
 	}
 
 	if (bsc_base_ctrl_cmds_install() != 0) {
-		printf("Failed to initialize the control commands. Exiting.\n");
+		printf("Failed to initialize the BSC control commands.\n");
+		return -1;
+	}
+
+	if (msc_ctrl_cmds_install() != 0) {
+		printf("Failed to initialize the MSC control commands.\n");
 		return -1;
 	}
 
diff --git a/openbsc/tests/ctrl_test_runner.py b/openbsc/tests/ctrl_test_runner.py
index afcd42c..07a005d 100644
--- a/openbsc/tests/ctrl_test_runner.py
+++ b/openbsc/tests/ctrl_test_runner.py
@@ -306,6 +306,33 @@
         self.assertEquals(r['var'], 'mcc')
         self.assertEquals(r['value'], '201')
 
+class TestCtrlNITB(TestCtrlBase):
+
+    def tearDown(self):
+        TestCtrlBase.tearDown(self)
+        os.unlink("test_hlr.sqlite3")
+
+    def ctrl_command(self):
+        return ["./src/osmo-nitb/osmo-nitb", "-c",
+                "doc/examples/osmo-nitb/nanobts/openbsc.cfg", "-l", "test_hlr.sqlite3"]
+
+    def ctrl_app(self):
+        return (4249, "./src/osmo-nitb/osmo-nitb", "OsmoBSC", "nitb")
+
+    def testSubscriberAdd(self):
+        r = self.do_set('subscriber-modify-v1', '2620345,445566')
+        self.assertEquals(r['mtype'], 'SET_REPLY')
+        self.assertEquals(r['var'], 'subscriber-modify-v1')
+        self.assertEquals(r['value'], 'OK')
+
+        r = self.do_set('subscriber-modify-v1', '2620345,445567')
+        self.assertEquals(r['mtype'], 'SET_REPLY')
+        self.assertEquals(r['var'], 'subscriber-modify-v1')
+        self.assertEquals(r['value'], 'OK')
+
+        # TODO. verify that the entry has been created and modified? Invoke
+        # the sqlite3 CLI or do it through the DB libraries?
+
 class TestCtrlNAT(TestCtrlBase):
 
     def ctrl_command(self):
@@ -348,6 +375,10 @@
     test = unittest.TestLoader().loadTestsFromTestCase(TestCtrlBSC)
     suite.addTest(test)
 
+def add_nitb_test(suite, workdir):
+    test = unittest.TestLoader().loadTestsFromTestCase(TestCtrlNITB)
+    suite.addTest(test)
+
 def add_nat_test(suite, workdir):
     if not os.path.isfile(os.path.join(workdir, "src/osmo-bsc_nat/osmo-bsc_nat")):
         print("Skipping the NAT test")
@@ -386,6 +417,7 @@
     print "Running tests for specific control commands"
     suite = unittest.TestSuite()
     add_bsc_test(suite, workdir)
+    add_nitb_test(suite, workdir)
     add_nat_test(suite, workdir)
     res = unittest.TextTestRunner(verbosity=verbose_level).run(suite)
     sys.exit(len(res.errors) + len(res.failures))
