diff --git a/xos/synchronizer/models/fabric-crossconnect.xproto b/xos/synchronizer/models/fabric-crossconnect.xproto
old mode 100644
new mode 100755
index 4a7e8dc..989ebc1
--- a/xos/synchronizer/models/fabric-crossconnect.xproto
+++ b/xos/synchronizer/models/fabric-crossconnect.xproto
@@ -1,5 +1,6 @@
 option name = "fabric-crossconnect";
 option app_label = "fabric-crossconnect";
+option legacy = "True";
 
 message FabricCrossconnectService (Service){
     option verbose_name = "Fabric Crossconnect Service";
@@ -12,6 +13,6 @@
 }
 
 message BNGPortMapping (XOSBase) {
-    required int32 s_tag = 1 [help_text = "S Tag", null = False, db_index = False, blank = False, unique=True, tosca_key=True];
+    required string s_tag = 1 [help_text = "Single s-tag, range of s-tags, or ANY", null = False, db_index = False, blank = False, unique=True, tosca_key=True];
     required int32 switch_port = 2 [help_text = "Port Number", null = False, db_index = False, blank = False];
 }
diff --git a/xos/synchronizer/models/models.py b/xos/synchronizer/models/models.py
new file mode 100755
index 0000000..75ebe1d
--- /dev/null
+++ b/xos/synchronizer/models/models.py
@@ -0,0 +1,52 @@
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# 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.
+
+from xos.exceptions import XOSValidationError
+
+from models_decl import FabricCrossconnectService_decl, FabricCrossconnectServiceInstance_decl, BNGPortMapping_decl
+
+class FabricCrossconnectService(FabricCrossconnectService_decl):
+    class Meta:
+        proxy = True
+
+class FabricCrossconnectServiceInstance(FabricCrossconnectServiceInstance_decl):
+   class Meta:
+        proxy = True
+
+class BNGPortMapping(BNGPortMapping_decl):
+    class Meta:
+        proxy = True
+
+    def validate_range(self, pattern):
+        for this_range in pattern.split(","):
+            this_range = this_range.strip()
+            if "-" in this_range:
+                (first, last) = this_range.split("-")
+                try:
+                    int(first.strip())
+                    int(last.strip())
+                except ValueError:
+                    raise XOSValidationError("Malformed range %s" % pattern)
+            elif this_range.lower()=="any":
+                pass
+            else:
+                try:
+                    int(this_range)
+                except ValueError:
+                    raise XOSValidationError("Malformed range %s" % pattern)
+
+    def save(self, *args, **kwargs):
+        self.validate_range(self.s_tag)
+        super(BNGPortMapping, self).save(*args, **kwargs)
+
diff --git a/xos/synchronizer/models/test_models.py b/xos/synchronizer/models/test_models.py
new file mode 100755
index 0000000..3d42609
--- /dev/null
+++ b/xos/synchronizer/models/test_models.py
@@ -0,0 +1,124 @@
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# 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.
+
+import unittest
+import os, sys
+from mock import patch, Mock, MagicMock
+
+test_path=os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
+service_dir=os.path.join(test_path, "../../../..")
+xos_dir=os.path.join(test_path, "../../..")
+if not os.path.exists(os.path.join(test_path, "new_base")):
+    xos_dir=os.path.join(test_path, "../../../../../../orchestration/xos/xos")
+    services_dir=os.path.join(xos_dir, "../../xos_services")
+
+# mocking XOS exception, as they're based in Django
+class Exceptions:
+    XOSValidationError = Exception
+    XOSProgrammingError = Exception
+    XOSPermissionDenied = Exception
+
+class XOS:
+    exceptions = Exceptions
+
+class TestFabricCrossconnectModels(unittest.TestCase):
+    def setUp(self):
+
+        self.sys_path_save = sys.path
+        sys.path.append(xos_dir)
+
+        self.xos = XOS
+
+        self.models_decl = Mock()
+        self.models_decl.BNGPortMapping_decl = MagicMock
+        self.models_decl.BNGPortMapping_decl.save = Mock()
+        self.models_decl.BNGPortMapping_decl.objects = Mock()
+        self.models_decl.BNGPortMapping_decl.objects.filter.return_value = []
+
+
+        modules = {
+            'xos.exceptions': self.xos.exceptions,
+            'models_decl': self.models_decl
+        }
+
+        self.module_patcher = patch.dict('sys.modules', modules)
+        self.module_patcher.start()
+
+        self.volt = Mock()
+
+        from models import BNGPortMapping
+
+        self.BNGPortMapping = BNGPortMapping()
+
+    def tearDown(self):
+        sys.path = self.sys_path_save
+
+    def test_validate_range_single(self):
+        bpm = self.BNGPortMapping()
+        bpm.validate_range("123")
+
+    def test_validate_range_commas(self):
+        bpm = self.BNGPortMapping()
+        bpm.validate_range("123, 456")
+
+    def test_validate_range_ANY(self):
+        bpm = self.BNGPortMapping()
+        bpm.validate_range("ANY")
+        bpm.validate_range("any")
+
+    def test_validate_range_dash(self):
+        bpm = self.BNGPortMapping()
+        bpm.validate_range("123-456")
+
+    def test_validate_dash_commas(self):
+        bpm = self.BNGPortMapping()
+        bpm.validate_range("123-456, 789 - 1000")
+
+    def test_validate_range_empty(self):
+        bpm = self.BNGPortMapping()
+        with self.assertRaises(Exception) as e:
+            bpm.validate_range("")
+
+        self.assertEqual(e.exception.message, 'Malformed range ')
+
+    def test_validate_range_none(self):
+        bpm = self.BNGPortMapping()
+        with self.assertRaises(Exception) as e:
+            bpm.validate_range("")
+
+        self.assertEqual(e.exception.message, 'Malformed range ')
+
+    def test_validate_range_all(self):
+        bpm = self.BNGPortMapping()
+        with self.assertRaises(Exception) as e:
+            bpm.validate_range("badstring")
+
+        self.assertEqual(e.exception.message, 'Malformed range badstring')
+
+    def test_validate_half_range(self):
+        bpm = self.BNGPortMapping()
+        with self.assertRaises(Exception) as e:
+            bpm.validate_range("123-")
+
+        self.assertEqual(e.exception.message, 'Malformed range 123-')
+
+    def test_validate_half_comma(self):
+        bpm = self.BNGPortMapping()
+        with self.assertRaises(Exception) as e:
+            bpm.validate_range("123,")
+
+        self.assertEqual(e.exception.message, 'Malformed range 123,')
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/xos/synchronizer/steps/sync_fabric_crossconnect_service_instance.py b/xos/synchronizer/steps/sync_fabric_crossconnect_service_instance.py
old mode 100644
new mode 100755
index 4a8a4cf..ee067de
--- a/xos/synchronizer/steps/sync_fabric_crossconnect_service_instance.py
+++ b/xos/synchronizer/steps/sync_fabric_crossconnect_service_instance.py
@@ -66,6 +66,39 @@
         s_tag = int(s_tag)
         return (s_tag, dpid)
 
+    def range_matches(self, value, pattern):
+        value=int(value)
+        for this_range in pattern.split(","):
+            this_range = this_range.strip()
+            if "-" in this_range:
+                (first, last) = this_range.split("-")
+                first = int(first.strip())
+                last = int(last.strip())
+                if (value>=first) and (value<=last):
+                    return True
+            elif this_range.lower()=="any":
+                return True
+            else:
+                if (value==int(this_range)):
+                    return True
+        return False
+
+    def find_bng(self, s_tag):
+        # See if there's a mapping for our s-tag directly
+        bng_mappings = BNGPortMapping.objects.filter(s_tag=str(s_tag))
+        if bng_mappings:
+            return bng_mappings[0]
+
+        # TODO(smbaker): Examine miss performance, and if necessary set a flag in the save method to allow filtering
+        # of mappings based on whether they are ranges or any.
+
+        # See if there are any ranges or "any" that match
+        for bng_mapping in BNGPortMapping.objects.all():
+            if self.range_matches(s_tag, bng_mapping.s_tag):
+                 return bng_mapping
+
+        return None
+
     def sync_record(self, o):
         self.log.info("Sync'ing Fabric Crossconnect Service Instance", service_instance=o)
 
@@ -77,10 +110,10 @@
         dpid = si.get_westbound_service_instance_properties("switch_datapath_id")
         west_port = si.get_westbound_service_instance_properties("switch_port")
 
-        bng_mappings = BNGPortMapping.objects.filter(s_tag = s_tag)
-        if not bng_mappings:
+        bng_mapping = self.find_bng(s_tag = s_tag)
+        if not bng_mapping:
             raise Exception("Unable to determine BNG port for s_tag %s" % s_tag)
-        east_port = bng_mappings[0].switch_port
+        east_port = bng_mapping.switch_port
 
         data = { "deviceId": dpid,
                  "vlanId": s_tag,
diff --git a/xos/synchronizer/steps/test_sync_fabric_crossconnect_service_instance.py b/xos/synchronizer/steps/test_sync_fabric_crossconnect_service_instance.py
old mode 100644
new mode 100755
index 4455497..a1b3e23
--- a/xos/synchronizer/steps/test_sync_fabric_crossconnect_service_instance.py
+++ b/xos/synchronizer/steps/test_sync_fabric_crossconnect_service_instance.py
@@ -125,6 +125,54 @@
         self.assertEqual(d["user"], "onos")
         self.assertEqual(d["pass"], "rocks")
 
+    def test_range_matches_single(self):
+        self.assertTrue(self.sync_step().range_matches(123, "123"))
+
+    def test_range_matches_single_incorrect(self):
+        self.assertFalse(self.sync_step().range_matches(123, "456"))
+
+    def test_range_matches_range(self):
+        self.assertTrue(self.sync_step().range_matches(123, "122-124"))
+
+    def test_range_matches_range_incorrect(self):
+        self.assertFalse(self.sync_step().range_matches(123, "110-113"))
+
+    def test_range_matches_any(self):
+        self.assertTrue(self.sync_step().range_matches(123, "ANY"))
+        self.assertTrue(self.sync_step().range_matches(123, "any"))
+
+    def test_find_bng_single(self):
+        with patch.object(BNGPortMapping.objects, "get_items") as bng_objects, \
+                patch.object(self.sync_step, "range_matches") as range_matches:
+            bngmapping = BNGPortMapping(s_tag="111", switch_port=4)
+            bng_objects.return_value = [bngmapping]
+
+            # this should not be called
+            range_matches.return_value = False
+
+            found_bng = self.sync_step().find_bng(111)
+            self.assertTrue(found_bng)
+            self.assertEqual(found_bng.switch_port, 4)
+
+            range_matches.assert_not_called()
+
+    def test_find_bng_any(self):
+        with patch.object(BNGPortMapping.objects, "get_items") as bng_objects:
+            bngmapping = BNGPortMapping(s_tag="ANY", switch_port=4)
+            bng_objects.return_value = [bngmapping]
+
+            found_bng = self.sync_step().find_bng(111)
+            self.assertTrue(found_bng)
+            self.assertEqual(found_bng.switch_port, 4)
+
+    def test_find_bng_range(self):
+        with patch.object(BNGPortMapping.objects, "get_items") as bng_objects:
+            bngmapping = BNGPortMapping(s_tag="100-200", switch_port=4)
+            bng_objects.return_value = [bngmapping]
+
+            found_bng = self.sync_step().find_bng(111)
+            self.assertTrue(found_bng)
+            self.assertEqual(found_bng.switch_port, 4)
 
     @requests_mock.Mocker()
     def test_sync(self, m):
@@ -137,7 +185,7 @@
             si = self.mock_westbound(fsi, s_tag=111, switch_datapath_id = "of:0000000000000201", switch_port = 3)
             serviceinstance_objects.return_value = [si]
 
-            bngmapping = BNGPortMapping(s_tag=111, switch_port=4)
+            bngmapping = BNGPortMapping(s_tag="111", switch_port=4)
             bng_objects.return_value = [bngmapping]
 
             desired_data = {"deviceId": "of:0000000000000201",
@@ -160,7 +208,7 @@
 
             fsi = FabricCrossconnectServiceInstance(id=7777, owner=self.service)
 
-            si = self.mock_westbound(fsi, s_tag=111, switch_datapath_id = "of:0000000000000201", switch_port = 3)
+            si = self.mock_westbound(fsi, s_tag="111", switch_datapath_id = "of:0000000000000201", switch_port = 3)
             serviceinstance_objects.return_value = [si]
 
             with self.assertRaises(Exception) as e:
diff --git a/xos/unittest.cfg b/xos/unittest.cfg
index 0dc4ba0..e35af11 100644
--- a/xos/unittest.cfg
+++ b/xos/unittest.cfg
@@ -3,6 +3,7 @@
 code-directories=synchronizer
                  model_policies
                  steps
+                 models
 
 [coverage]
 always-on = True
