diff --git a/tests/data_model_tests.py b/tests/data_model_tests.py
new file mode 100644
index 0000000..e813354
--- /dev/null
+++ b/tests/data_model_tests.py
@@ -0,0 +1,137 @@
+"""
+Copyright 2020 The Magma Authors.
+
+This source code is licensed under the BSD-style license found in the
+LICENSE file in the root directory of this source tree.
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+
+# pylint: disable=protected-access
+
+from unittest import TestCase
+
+from data_models.data_model_parameters import ParameterName
+from devices.baicells import BaicellsTrDataModel
+
+
+class BaicellsTrDataModelTest(TestCase):
+    """
+    Tests for BaicellsTrDataModel
+    """
+
+    def test_is_parameter_present(self):
+        data_model = BaicellsTrDataModel()
+        with self.assertRaises(KeyError):
+            data_model.is_parameter_present(ParameterName.GPS_LONG)
+
+        result = data_model.is_parameter_present(ParameterName.DEVICE)
+        self.assertTrue(result, "Should have the device parameter")
+
+    def test_get_parameter(self):
+        param_info =\
+            BaicellsTrDataModel.get_parameter(ParameterName.GPS_STATUS)
+        self.assertIsNotNone(
+            param_info,
+            'Cannot get parameter info on %s' % ParameterName.GPS_STATUS,
+        )
+        path = param_info.path
+        expected_path = 'Device.DeviceInfo.X_BAICELLS_COM_GPS_Status'
+        self.assertEqual(
+            path,
+            expected_path,
+            'Path for parameter %s has incorrect value' %
+            ParameterName.GPS_STATUS,
+        )
+
+    def test_get_num_plmns(self):
+        n_plmns = BaicellsTrDataModel.get_num_plmns()
+        expected_n_plmns = 6
+        self.assertEqual(n_plmns, expected_n_plmns, 'Incorrect # of PLMNs')
+
+    def test_get_parameter_names(self):
+        name_list = BaicellsTrDataModel.get_parameter_names()
+
+        # Check that some random parameter names we expect are there
+        self.assertIn(
+            ParameterName.MME_STATUS, name_list,
+            'Should have %s in parameter name list' %
+            ParameterName.MME_STATUS,
+        )
+        self.assertIn(
+            ParameterName.DUPLEX_MODE_CAPABILITY, name_list,
+            'Should have %s in parameter name list' %
+            ParameterName.DUPLEX_MODE_CAPABILITY,
+        )
+        self.assertIn(
+            ParameterName.EARFCNUL, name_list,
+            'Should have %s in parameter name list' %
+            ParameterName.EARFCNUL,
+        )
+
+        # Check that some other parameter names are missing
+        self.assertNotIn(
+            ParameterName.PLMN, name_list,
+            'Should not have %s in parameter name list' %
+            ParameterName.PLMN,
+        )
+        self.assertNotIn(
+            ParameterName.PLMN_N % 1, name_list,
+            'Should not have %s in parameter name list' %
+            ParameterName.PLMN_N % 1,
+        )
+
+    def test_get_numbered_param_names(self):
+        name_list = list(BaicellsTrDataModel.get_numbered_param_names().keys())
+
+        # Check that unnumbered parameters are missing
+        self.assertNotIn(
+            ParameterName.EARFCNDL, name_list,
+            'Should not have %s in parameter name list' %
+            ParameterName.EARFCNDL,
+        )
+        self.assertNotIn(
+            ParameterName.MME_PORT, name_list,
+            'Should not have %s in parameter name list' %
+            ParameterName.MME_PORT,
+        )
+        self.assertNotIn(
+            ParameterName.PERIODIC_INFORM_ENABLE, name_list,
+            'Should not have %s in parameter name list' %
+            ParameterName.PERIODIC_INFORM_ENABLE,
+        )
+
+        # Check that some numbered parameters are present
+        self.assertIn(
+            ParameterName.PLMN_N % 1, name_list,
+            'Should have %s in parameter name list' %
+            ParameterName.PLMN_N % 1,
+        )
+        self.assertIn(
+            ParameterName.PLMN_N % 6, name_list,
+            'Should have %s in parameter name list' %
+            ParameterName.PLMN_N % 6,
+        )
+
+    def test_transform_for_magma(self):
+        gps_lat = str(10 * 1000000)
+        gps_lat_magma = BaicellsTrDataModel.transform_for_magma(
+            ParameterName.GPS_LAT, gps_lat,
+        )
+        expected = str(10.0)
+        self.assertEqual(gps_lat_magma, expected)
+
+    def test_transform_for_enb(self):
+        dl_bandwidth = 15
+        dl_bandwidth_enb = BaicellsTrDataModel.transform_for_enb(
+            ParameterName.DL_BANDWIDTH, dl_bandwidth,
+        )
+        expected = 'n75'
+        self.assertEqual(
+            dl_bandwidth_enb, expected,
+            'Transform for enb returning incorrect value',
+        )
