AETHER-3162 Remove magma leftover iptables rule from enodebd

AETHER-3198 Add REUSE compliant to enodebd
AETHER-3196 Support identify IP from X-Real IP in enodebd
AETHER-3229 Documentation of configuration and state machine for enodebd
AETHER-3292 Adding new parameter to support in enodebd Sercomm driver
AETHER-3311 Remove unused protobuf definition from enodebd

Change-Id: Ie69f0141eff70cb3d4447cd9575c8224d42dd5e3
diff --git a/.gitignore b/.gitignore
index bbd439d..8c1d924 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,3 @@
-lte/
-orc8r/
-prometheus.yml
-metrics_pb2.py
-metrics_pb2_grpc.py
-
 ### Log ###
 *.log
 
@@ -13,3 +7,22 @@
 *.py[cod]
 *$py.class
 
+# Virtual Environment
+venv/
+
+### enodebd ###
+magma_configs/enodebd.yml
+magma_configs/serial_number/
+!magma_configs/serial_number/example.yml
+
+# enodebd generated proto model
+lte/
+orc8r/
+
+# enodebd proto files
+!proto_files/lte/
+!proto_files/orc8r/
+
+prometheus.yml
+metrics_pb2.py
+metrics_pb2_grpc.py
\ No newline at end of file
diff --git a/LICENSES/Apache-2.0.txt b/LICENSES/Apache-2.0.txt
new file mode 100644
index 0000000..137069b
--- /dev/null
+++ b/LICENSES/Apache-2.0.txt
@@ -0,0 +1,73 @@
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
+
+"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
+
+     (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
+
+     (b) You must cause any modified files to carry prominent notices stating that You changed the files; and
+
+     (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
+
+     (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
+
+     You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!)  The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+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.
diff --git a/LICENSES/BSD-3-Clause.txt b/LICENSES/BSD-3-Clause.txt
new file mode 100644
index 0000000..ea890af
--- /dev/null
+++ b/LICENSES/BSD-3-Clause.txt
@@ -0,0 +1,11 @@
+Copyright (c) <year> <owner>. 
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Makefile b/Makefile
index f088888..bd3c569 100644
--- a/Makefile
+++ b/Makefile
@@ -26,6 +26,19 @@
   python -m pip install -r requirements.txt
 	echo "To enter virtualenv, run 'source $@/bin/activate'"
 
+install-protoc: ## Get the protobyf from GitHub
+	curl -L https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-linux-x86_64.zip -o /opt/protoc.zip ;\
+  unzip -o /opt/protoc.zip -d /opt/protobuf ;\
+  ln -sf /opt/protobuf/bin/protoc /usr/bin/
+
+proto: $(VENV_NAME) ## Compile proto definition of enodebd
+	source ./$</bin/activate ; set -u ;\
+  python tools/gen_protos.py proto_files/orc8r/protos \
+     proto_files,proto_files/orc8r/protos/prometheus,/opt/protobuf/include proto_files . ;\
+  python tools/gen_protos.py proto_files/lte/protos \
+     proto_files,proto_files/orc8r/protos/prometheus,/opt/protobuf/include proto_files . ;\
+  python tools/gen_prometheus_proto.py . .
+
 license: $(VENV_NAME) ## Check license with the reuse tool
 	source ./$</bin/activate ; set -u ;\
   reuse --version ;\
diff --git a/README.md b/README.md
index a176859..5613d8b 100644
--- a/README.md
+++ b/README.md
@@ -50,3 +50,6 @@
 $ docker run -p 9090:9090 -v /home/ubuntu/magma-enodebd-new/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
 ```
 
+# License
+
+This project is under 3-Clause BSD license.
\ No newline at end of file
diff --git a/common/__init__.py b/common/__init__.py
index 5c6cb64..f07652e 100644
--- a/common/__init__.py
+++ b/common/__init__.py
@@ -1,12 +1,4 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
\ No newline at end of file
diff --git a/common/cert_utils.py b/common/cert_utils.py
index e19063f..35c2bd6 100644
--- a/common/cert_utils.py
+++ b/common/cert_utils.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import base64
 
diff --git a/common/cert_validity.py b/common/cert_validity.py
index 83a765c..ac2b536 100644
--- a/common/cert_validity.py
+++ b/common/cert_validity.py
@@ -1,14 +1,7 @@
-"""
-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.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 Util module to distinguish between the reasons checkins stop working: network
 is down or cert is invalid.
diff --git a/common/grpc_client_manager.py b/common/grpc_client_manager.py
index dbaff76..99b308a 100644
--- a/common/grpc_client_manager.py
+++ b/common/grpc_client_manager.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import logging
 import sys
diff --git a/common/health/__init__.py b/common/health/__init__.py
index 5c6cb64..f07652e 100644
--- a/common/health/__init__.py
+++ b/common/health/__init__.py
@@ -1,12 +1,4 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
\ No newline at end of file
diff --git a/common/health/docker_health_service.py b/common/health/docker_health_service.py
index 70a728a..109417d 100644
--- a/common/health/docker_health_service.py
+++ b/common/health/docker_health_service.py
@@ -1,17 +1,9 @@
-#!/usr/bin/env python3
+#! /usr/bin/env python3
 
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from datetime import datetime
 
diff --git a/common/health/entities.py b/common/health/entities.py
index ab32496..a2903ec 100644
--- a/common/health/entities.py
+++ b/common/health/entities.py
@@ -1,17 +1,10 @@
-#!/usr/bin/env python3
+# !/usr/bin/env python3
 
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 import textwrap
 
 
diff --git a/common/health/health_service.py b/common/health/health_service.py
index 4228330..7e55e37 100644
--- a/common/health/health_service.py
+++ b/common/health/health_service.py
@@ -1,17 +1,9 @@
-#!/usr/bin/env python3
+# !/usr/bin/env python3
 
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import asyncio
 import os
diff --git a/common/health/service_state_wrapper.py b/common/health/service_state_wrapper.py
index 7c1f707..7dd0fc1 100644
--- a/common/health/service_state_wrapper.py
+++ b/common/health/service_state_wrapper.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from common.redis.client import get_default_client
 from common.redis.containers import RedisFlatDict
diff --git a/common/job.py b/common/job.py
index f3ba0d2..54aaca7 100644
--- a/common/job.py
+++ b/common/job.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import abc
 import asyncio
diff --git a/common/log_count_handler.py b/common/log_count_handler.py
index 55b5ecf..9ee329f 100644
--- a/common/log_count_handler.py
+++ b/common/log_count_handler.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import logging
 
diff --git a/common/log_counter.py b/common/log_counter.py
index 4f2aea3..c79947f 100644
--- a/common/log_counter.py
+++ b/common/log_counter.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import asyncio
 from typing import Any
diff --git a/common/metrics.py b/common/metrics.py
index ebb3bae..9bab2eb 100644
--- a/common/metrics.py
+++ b/common/metrics.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 from prometheus_client import Counter
 
 STREAMER_RESPONSES = Counter(
diff --git a/common/metrics_export.py b/common/metrics_export.py
index 964e3fb..9931759 100644
--- a/common/metrics_export.py
+++ b/common/metrics_export.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import logging
 import time
diff --git a/common/misc_utils.py b/common/misc_utils.py
index 4d8e5ec..4e0f7b4 100644
--- a/common/misc_utils.py
+++ b/common/misc_utils.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import asyncio
 import ipaddress
diff --git a/common/redis/__init__.py b/common/redis/__init__.py
index 5c6cb64..f07652e 100644
--- a/common/redis/__init__.py
+++ b/common/redis/__init__.py
@@ -1,12 +1,4 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
\ No newline at end of file
diff --git a/common/redis/client.py b/common/redis/client.py
index 65acd87..17540e7 100644
--- a/common/redis/client.py
+++ b/common/redis/client.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 import redis
 from configuration.service_configs import get_service_config_value
 
diff --git a/common/redis/containers.py b/common/redis/containers.py
index c227e4d..cac248f 100644
--- a/common/redis/containers.py
+++ b/common/redis/containers.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 from copy import deepcopy
 from typing import Any, Iterator, List, MutableMapping, Optional, TypeVar
 
diff --git a/common/redis/mocks/__init__.py b/common/redis/mocks/__init__.py
index 5c6cb64..f07652e 100644
--- a/common/redis/mocks/__init__.py
+++ b/common/redis/mocks/__init__.py
@@ -1,12 +1,4 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
\ No newline at end of file
diff --git a/common/redis/mocks/mock_redis.py b/common/redis/mocks/mock_redis.py
index 0978932..684d0cf 100644
--- a/common/redis/mocks/mock_redis.py
+++ b/common/redis/mocks/mock_redis.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 from redis.exceptions import RedisError
 
 # For non-failure cases, just use the fakeredis module
diff --git a/common/redis/serializers.py b/common/redis/serializers.py
index d8b01e1..daabd22 100644
--- a/common/redis/serializers.py
+++ b/common/redis/serializers.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 from typing import Callable, Generic, Type, TypeVar
 
 import jsonpickle
diff --git a/common/redis/tests/__init__.py b/common/redis/tests/__init__.py
index 5c6cb64..f07652e 100644
--- a/common/redis/tests/__init__.py
+++ b/common/redis/tests/__init__.py
@@ -1,12 +1,4 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
\ No newline at end of file
diff --git a/common/redis/tests/dict_tests.py b/common/redis/tests/dict_tests.py
index e9508bc..fa27163 100644
--- a/common/redis/tests/dict_tests.py
+++ b/common/redis/tests/dict_tests.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 from unittest import TestCase, main
 
 import fakeredis
diff --git a/common/rpc_utils.py b/common/rpc_utils.py
index 5fcbbf9..b3306b9 100644
--- a/common/rpc_utils.py
+++ b/common/rpc_utils.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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=broad-except
 
 import asyncio
diff --git a/common/sdwatchdog.py b/common/sdwatchdog.py
index 2eb4e52..eab19de 100644
--- a/common/sdwatchdog.py
+++ b/common/sdwatchdog.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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=W0223
 
 import asyncio
diff --git a/common/sentry.py b/common/sentry.py
index eb433ed..d72344c 100644
--- a/common/sentry.py
+++ b/common/sentry.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import os
 
diff --git a/common/serialization_utils.py b/common/serialization_utils.py
index dc13a5c..4f654e8 100644
--- a/common/serialization_utils.py
+++ b/common/serialization_utils.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import codecs
 import os
diff --git a/common/service.py b/common/service.py
index 59f06ca..1e98483 100644
--- a/common/service.py
+++ b/common/service.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import asyncio
 import faulthandler
@@ -271,7 +263,12 @@
         self._state = ServiceInfo.STOPPING
         self._server.stop(0)
 
-        for pending_task in asyncio.Task.all_tasks(self._loop):
+        try:
+            asyncio_all_tasks = asyncio.all_tasks
+        except AttributeError as e:
+            asyncio_all_tasks = asyncio.Task.all_tasks
+
+        for pending_task in asyncio_all_tasks(self._loop):
             pending_task.cancel()
 
         self._state = ServiceInfo.STOPPED
diff --git a/common/service_registry.py b/common/service_registry.py
index 044852f..2df70fd 100644
--- a/common/service_registry.py
+++ b/common/service_registry.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import logging
 import os
diff --git a/common/stateless_agw.py b/common/stateless_agw.py
index fb24924..7408a58 100644
--- a/common/stateless_agw.py
+++ b/common/stateless_agw.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import logging
 import subprocess
diff --git a/common/streamer.py b/common/streamer.py
index 01632d3..282886c 100644
--- a/common/streamer.py
+++ b/common/streamer.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import abc
 import logging
diff --git a/common/tests/cert_utils_tests.py b/common/tests/cert_utils_tests.py
index 6563ff9..bf49cb3 100644
--- a/common/tests/cert_utils_tests.py
+++ b/common/tests/cert_utils_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import base64
 import datetime
diff --git a/common/tests/cert_validity_tests.py b/common/tests/cert_validity_tests.py
index 8ce67dc..1d18569 100644
--- a/common/tests/cert_validity_tests.py
+++ b/common/tests/cert_validity_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import asyncio
 import errno
diff --git a/common/tests/metrics_tests.py b/common/tests/metrics_tests.py
index f48f2f8..04c89a2 100644
--- a/common/tests/metrics_tests.py
+++ b/common/tests/metrics_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import unittest
 import unittest.mock
diff --git a/common/tests/service303_tests.py b/common/tests/service303_tests.py
index 49175e4..45df9c8 100644
--- a/common/tests/service303_tests.py
+++ b/common/tests/service303_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import asyncio
 from unittest import TestCase, main, mock
diff --git a/configuration/__init__.py b/configuration/__init__.py
index b78acae..a69ddd5 100644
--- a/configuration/__init__.py
+++ b/configuration/__init__.py
@@ -1,3 +1,8 @@
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
 import importlib
 import logging
 
diff --git a/configuration/environment.py b/configuration/environment.py
index c2b6722..72aab5f 100644
--- a/configuration/environment.py
+++ b/configuration/environment.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import os
 
diff --git a/configuration/events.py b/configuration/events.py
index 308f1be..a22aaef 100644
--- a/configuration/events.py
+++ b/configuration/events.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import snowflake
 from eventd.eventd_client import log_event
diff --git a/configuration/exceptions.py b/configuration/exceptions.py
index 79a8907..e565d74 100644
--- a/configuration/exceptions.py
+++ b/configuration/exceptions.py
@@ -1,16 +1,7 @@
-"""
-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.
-"""
-
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 class LoadConfigError(Exception):
     pass
diff --git a/configuration/mconfig_managers.py b/configuration/mconfig_managers.py
index 3b76418..d55909e 100644
--- a/configuration/mconfig_managers.py
+++ b/configuration/mconfig_managers.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 import abc
 import contextlib
 import json
diff --git a/configuration/mconfigs.py b/configuration/mconfigs.py
index 88862b5..bf9194a 100644
--- a/configuration/mconfigs.py
+++ b/configuration/mconfigs.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from typing import Any as TAny
 from typing import Dict
diff --git a/configuration/service_configs.py b/configuration/service_configs.py
index f2d0f24..a3d270d 100644
--- a/configuration/service_configs.py
+++ b/configuration/service_configs.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import logging
 import os
diff --git a/configuration/tests/__init__.py b/configuration/tests/__init__.py
index 5c6cb64..f07652e 100644
--- a/configuration/tests/__init__.py
+++ b/configuration/tests/__init__.py
@@ -1,12 +1,4 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
\ No newline at end of file
diff --git a/configuration/tests/mconfig_manager_impl_tests.py b/configuration/tests/mconfig_manager_impl_tests.py
index 4be0adc..9e26ed1 100644
--- a/configuration/tests/mconfig_manager_impl_tests.py
+++ b/configuration/tests/mconfig_manager_impl_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import unittest
 from unittest import mock
diff --git a/configuration/tests/mconfigs_tests.py b/configuration/tests/mconfigs_tests.py
index be8ae0f..24f4bb1 100644
--- a/configuration/tests/mconfigs_tests.py
+++ b/configuration/tests/mconfigs_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import unittest
 from unittest import mock
diff --git a/data_models/__init__.py b/data_models/__init__.py
index 5c6cb64..f07652e 100644
--- a/data_models/__init__.py
+++ b/data_models/__init__.py
@@ -1,12 +1,4 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
\ No newline at end of file
diff --git a/data_models/data_model.py b/data_models/data_model.py
index 0c8ba27..997748f 100644
--- a/data_models/data_model.py
+++ b/data_models/data_model.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from abc import ABC, abstractmethod
 from collections import namedtuple
diff --git a/data_models/data_model_parameters.py b/data_models/data_model_parameters.py
index 751b351..3b83067 100644
--- a/data_models/data_model_parameters.py
+++ b/data_models/data_model_parameters.py
@@ -1,16 +1,7 @@
-"""
-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.
-"""
-
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 class ParameterName():
     # Top-level objects
@@ -53,8 +44,6 @@
     PCI = 'PCI'
     DL_BANDWIDTH = 'DL bandwidth'
     UL_BANDWIDTH = 'UL bandwidth'
-    SUBFRAME_ASSIGNMENT = 'Subframe assignment'
-    SPECIAL_SUBFRAME_PATTERN = 'Special subframe pattern'
     TX_POWER = "tx_power"
     TUNNEL_TYPE = "tunnel_type"
 
@@ -73,6 +62,11 @@
     CELL_BARRED = 'Cell barred'
     PRIM_SOURCE = "prim_source"
 
+    # Cell parameters
+    CELL_ENABLE64QAM = "cell_enable64qam"
+    SPECIAL_SUBFRAME_PATTERN = 'special_subframe_pattern'
+    SUBFRAME_ASSIGNMENT = 'subframe_assignment'
+
     # Core network parameters
     MME_IP = 'MME IP'
     MME_PORT = 'MME port'
diff --git a/data_models/transform_for_enb.py b/data_models/transform_for_enb.py
index 7f3aaf8..6075f40 100644
--- a/data_models/transform_for_enb.py
+++ b/data_models/transform_for_enb.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from exceptions import ConfigurationError
 
diff --git a/data_models/transform_for_magma.py b/data_models/transform_for_magma.py
index 715cfba..e7c2b81 100644
--- a/data_models/transform_for_magma.py
+++ b/data_models/transform_for_magma.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 import textwrap
 from typing import Optional, Union
 
diff --git a/device_config/__init__.py b/device_config/__init__.py
index 5c6cb64..f07652e 100644
--- a/device_config/__init__.py
+++ b/device_config/__init__.py
@@ -1,12 +1,4 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
\ No newline at end of file
diff --git a/device_config/configuration_init.py b/device_config/configuration_init.py
index 2c4e342..6139c06 100644
--- a/device_config/configuration_init.py
+++ b/device_config/configuration_init.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import json
 from collections import namedtuple
diff --git a/device_config/configuration_util.py b/device_config/configuration_util.py
index cf746c1..b4d29db 100644
--- a/device_config/configuration_util.py
+++ b/device_config/configuration_util.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 from typing import NamedTuple, Optional
 
 from lte.protos.mconfig.mconfigs_pb2 import EnodebD
diff --git a/device_config/enodeb_config_postprocessor.py b/device_config/enodeb_config_postprocessor.py
index 5cb469a..e8aebc6 100644
--- a/device_config/enodeb_config_postprocessor.py
+++ b/device_config/enodeb_config_postprocessor.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 from abc import ABC, abstractmethod
 from typing import Any
 
diff --git a/device_config/enodeb_configuration.py b/device_config/enodeb_configuration.py
index 6e0b951..2b35271 100644
--- a/device_config/enodeb_configuration.py
+++ b/device_config/enodeb_configuration.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import json
 from typing import Any, List
diff --git a/devices/baicells.py b/devices/baicells.py
index db7f8c1..7023d34 100644
--- a/devices/baicells.py
+++ b/devices/baicells.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from typing import Any, Callable, Dict, List, Optional, Type
 
diff --git a/devices/baicells_old.py b/devices/baicells_old.py
index f5db4b5..70c894f 100644
--- a/devices/baicells_old.py
+++ b/devices/baicells_old.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from typing import Any, Callable, Dict, List, Optional, Type
 
diff --git a/devices/baicells_qafa.py b/devices/baicells_qafa.py
index e30a59b..deb12e4 100644
--- a/devices/baicells_qafa.py
+++ b/devices/baicells_qafa.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from typing import Any, Callable, Dict, List, Optional, Type
 
diff --git a/devices/baicells_qafb.py b/devices/baicells_qafb.py
index 0f2e9cd..1cd80df 100644
--- a/devices/baicells_qafb.py
+++ b/devices/baicells_qafb.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from typing import Any, Callable, Dict, List, Optional, Type
 
diff --git a/devices/baicells_rts.py b/devices/baicells_rts.py
index 9a2cafd..ed4899d 100644
--- a/devices/baicells_rts.py
+++ b/devices/baicells_rts.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from typing import Any, Callable, Dict, List, Optional, Type
 
diff --git a/devices/device_map.py b/devices/device_map.py
index 198c4d3..10aa841 100644
--- a/devices/device_map.py
+++ b/devices/device_map.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from typing import Type
 
diff --git a/devices/device_utils.py b/devices/device_utils.py
index 3eb91cb..1f951e2 100644
--- a/devices/device_utils.py
+++ b/devices/device_utils.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import re
 
diff --git a/devices/experimental/cavium.py b/devices/experimental/cavium.py
index c62a622..7b939dc 100644
--- a/devices/experimental/cavium.py
+++ b/devices/experimental/cavium.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from typing import Any, Callable, Dict, List, Optional, Type
 
diff --git a/devices/freedomfi_one.py b/devices/freedomfi_one.py
index 4dfee90..9ad6b00 100644
--- a/devices/freedomfi_one.py
+++ b/devices/freedomfi_one.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 import logging
 from typing import Any, Callable, Dict, List, Optional, Type
 
@@ -659,7 +652,7 @@
         ParameterName.SUBFRAME_ASSIGNMENT: TrParam(
             FAPSERVICE_PATH + "CellConfig.LTE.RAN.PHY.TDDFrame.SubFrameAssignment",
             is_invasive=False,
-            type=TrParameterType.BOOLEAN,
+            type=TrParameterType.INT,
             is_optional=False,
         ),
         ParameterName.SPECIAL_SUBFRAME_PATTERN: TrParam(
@@ -668,6 +661,12 @@
             type=TrParameterType.INT,
             is_optional=False,
         ),
+        ParameterName.CELL_ENABLE64QAM: TrParam(
+            FAPSERVICE_PATH + "CellConfig.LTE.RAN.PHY.PUSCH.Enable64QAM",
+            is_invasive=False,
+            type=TrParameterType.BOOLEAN,
+            is_optional=False,
+        ),
         ParameterName.CELL_ID: TrParam(
             FAPSERVICE_PATH + "CellConfig.LTE.RAN.Common.CellIdentity",
             is_invasive=False,
diff --git a/docs/assets/state_map_example.png b/docs/assets/state_map_example.png
new file mode 100644
index 0000000..d1b6c3b
--- /dev/null
+++ b/docs/assets/state_map_example.png
Binary files differ
diff --git a/docs/configuration_guide.md b/docs/configuration_guide.md
new file mode 100644
index 0000000..d7153e9
--- /dev/null
+++ b/docs/configuration_guide.md
@@ -0,0 +1,17 @@
+# eNodeBD Configuration Guide
+
+eNodeBD (eNodeB daemon), which also called ACS(Automatic Configuration Server), is using for configuring and operating eNodeB by programmed steps.
+
+In the beginning, we need to learn what configuration eNodeBD have, and how to configure it as we need.
+
+## magma_configs/serial_number/`{serial_number}`.yml
+
+This file needs to be named exactly same as the enodeb's serial number, when a new eNodeB register to ACS, ACS will ask eNodeB to provide serial number and other information for giving a proper configuration to eNodeB, and ACS will search in this directory to find if there has a configuration for specific eNodeB. If no configuration file found, it will use Magma default configuration for eNodeB.
+
+## magma_configs/acs_common.yml
+
+This file provides the common parameter for generating eNodeB-specific configuration, if the `{serial_number}.yml` doesn't provide with the value of parameters, ACS will use the value declared in `acs_common.yml` in generated configuration.
+
+## override_configs/gateway.mconfig
+
+The configuration of eNodeBD services, included default configuration for unknown eNodeB, and also the log level of eNodeBD.
\ No newline at end of file
diff --git a/docs/state_machine.md b/docs/state_machine.md
new file mode 100644
index 0000000..37ee9cf
--- /dev/null
+++ b/docs/state_machine.md
@@ -0,0 +1,14 @@
+# The concept of State Machine
+
+The state machine map was pre-defined in eNodeBD driver, and the state machine managers are responsible to maintain the current state and related information. After event triggered or condition satisfied, the state machine manager will transfer the state to next state.
+
+The eNodeBD will initiate a state machine manager for each eNodeB when a new connection incoming, it uses source IP address or NGINX real IP header as key to build state machine manager instance.
+
+## StateMap
+
+In the state map, it always start from `wait-inform` state, the state map defined by `ENodeBHandler._state_map`, which can be illustrated as the following diagraph.
+
+![State Machine Example](assets/state_map_example.png)
+
+In the example, the state map shows the state will change by different cases, in `get_transient_params` state, ACS will get the firmware version from eNB, when the version is different from desired version, the state will change to `firmware_upgrade` state and do the upgrade, otherwise, it will move on to the `get_params` and start configuring process.
+
diff --git a/enodeb_status.py b/enodeb_status.py
index 442061b..7f19f9b 100644
--- a/enodeb_status.py
+++ b/enodeb_status.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import json
 import os
diff --git a/enodebd_iptables_rules.py b/enodebd_iptables_rules.py
deleted file mode 100644
index 39ffc02..0000000
--- a/enodebd_iptables_rules.py
+++ /dev/null
@@ -1,158 +0,0 @@
-#!/usr/bin/env python3
-
-"""
-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.
-"""
-
-
-import asyncio
-import re
-import shlex
-import subprocess
-from typing import List
-
-from common.misc_utils import (
-    IpPreference,
-    get_if_ip_with_netmask,
-    get_ip_from_if,
-)
-from configuration.service_configs import load_service_config
-from logger import EnodebdLogger as logger
-
-IPTABLES_RULE_FMT = """sudo iptables -t nat
-    -{add} PREROUTING
-    -d {public_ip}
-    -p tcp
-    --dport {port}
-    -j DNAT --to-destination {private_ip}"""
-
-EXPECTED_IP4 = ('192.168.60.142', '10.0.2.1')
-EXPECTED_MASK = '255.255.255.0'
-
-
-def get_iptables_rule(port, enodebd_public_ip, private_ip, add=True):
-    return IPTABLES_RULE_FMT.format(
-        add='A' if add else 'D',
-        public_ip=enodebd_public_ip,
-        port=port,
-        private_ip=private_ip,
-    )
-
-
-def does_iface_config_match_expected(ip: str, netmask: str) -> bool:
-    return ip in EXPECTED_IP4 and netmask == EXPECTED_MASK
-
-
-def _get_prerouting_rules(output: str) -> List[str]:
-    prerouting_rules = output.split('\n\n')[0]
-    prerouting_rules = prerouting_rules.split('\n')
-    # Skipping the first two lines since it contains only column names
-    prerouting_rules = prerouting_rules[2:]
-    return prerouting_rules
-
-
-async def check_and_apply_iptables_rules(
-    port: str,
-    enodebd_public_ip: str,
-    enodebd_ip: str,
-) -> None:
-    command = 'sudo iptables -t nat -L'
-    output = subprocess.run(command, shell=True, stdout=subprocess.PIPE, check=True)
-    command_output = output.stdout.decode('utf-8').strip()
-    prerouting_rules = _get_prerouting_rules(command_output)
-    if not prerouting_rules:
-        logger.info('Configuring Iptables rule')
-        await run(
-            get_iptables_rule(
-                port,
-                enodebd_public_ip,
-                enodebd_ip,
-                add=True,
-            ),
-        )
-    else:
-        # Checks each rule in PREROUTING Chain
-        check_rules(prerouting_rules, port, enodebd_public_ip, enodebd_ip)
-
-
-def check_rules(
-    prerouting_rules: List[str],
-    port: str,
-    enodebd_public_ip: str,
-    private_ip: str,
-) -> None:
-    unexpected_rules = []
-    pattern = r'DNAT\s+tcp\s+--\s+anywhere\s+{pub_ip}\s+tcp\s+dpt:{dport} to:{ip}'.format(
-                pub_ip=enodebd_public_ip,
-                dport=port,
-                ip=private_ip,
-    )
-    for rule in prerouting_rules:
-        match = re.search(pattern, rule)
-        if not match:
-            unexpected_rules.append(rule)
-    if unexpected_rules:
-        logger.warning('The following Prerouting rule(s) are unexpected')
-        for rule in unexpected_rules:
-            logger.warning(rule)
-
-
-async def run(cmd):
-    """Fork shell and run command NOTE: Popen is non-blocking"""
-    cmd = shlex.split(cmd)
-    proc = await asyncio.create_subprocess_shell(" ".join(cmd))
-    await proc.communicate()
-    if proc.returncode != 0:
-        # This can happen because the NAT prerouting rule didn't exist
-        logger.error(
-            'Possible error running async subprocess: %s exited with '
-            'return code [%d].', cmd, proc.returncode,
-        )
-    return proc.returncode
-
-
-async def set_enodebd_iptables_rule():
-    """
-    Remove & Set iptable rules for exposing public IP
-    for enobeb instead of private IP..
-    """
-    # Remove & Set iptable rules for exposing public ip
-    # for enobeb instead of private
-    cfg = load_service_config('enodebd')
-    port, interface = cfg['tr069']['port'], cfg['tr069']['interface']
-    enodebd_public_ip = cfg['tr069']['public_ip']
-    # IPv4 only as iptables only works for IPv4. TODO: Investigate ip6tables?
-    enodebd_ip = get_ip_from_if(interface, preference=IpPreference.IPV4_ONLY)
-    # Incoming data from 192.88.99.142 -> enodebd address (eg 192.168.60.142)
-    enodebd_netmask = get_if_ip_with_netmask(
-        interface,
-        preference=IpPreference.IPV4_ONLY,
-    )[1]
-    verify_config = does_iface_config_match_expected(
-        enodebd_ip,
-        enodebd_netmask,
-    )
-    if not verify_config:
-        logger.warning(
-            'The IP address of the %s interface is %s. The '
-            'expected IP addresses are %s',
-            interface, enodebd_ip, str(EXPECTED_IP4),
-        )
-    await check_and_apply_iptables_rules(
-        port,
-        enodebd_public_ip,
-        enodebd_ip,
-    )
-
-
-if __name__ == '__main__':
-    set_enodebd_iptables_rule()
diff --git a/eventd/__init__.py b/eventd/__init__.py
index 5c6cb64..f07652e 100644
--- a/eventd/__init__.py
+++ b/eventd/__init__.py
@@ -1,12 +1,4 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
\ No newline at end of file
diff --git a/eventd/event_validator.py b/eventd/event_validator.py
index 31b1636..2243a20 100644
--- a/eventd/event_validator.py
+++ b/eventd/event_validator.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import json
 import logging
diff --git a/eventd/eventd_client.py b/eventd/eventd_client.py
index 3f8b63e..3211a51 100644
--- a/eventd/eventd_client.py
+++ b/eventd/eventd_client.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 import logging
 
 import grpc
diff --git a/eventd/main.py b/eventd/main.py
index 64bb124..eff5511 100644
--- a/eventd/main.py
+++ b/eventd/main.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from common.sentry import sentry_init
 from common.service import MagmaService
diff --git a/eventd/rpc_servicer.py b/eventd/rpc_servicer.py
index 5b1e641..31b17f1 100644
--- a/eventd/rpc_servicer.py
+++ b/eventd/rpc_servicer.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import json
 import logging
diff --git a/eventd/tests/__init__.py b/eventd/tests/__init__.py
index 5c6cb64..f07652e 100644
--- a/eventd/tests/__init__.py
+++ b/eventd/tests/__init__.py
@@ -1,12 +1,4 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
\ No newline at end of file
diff --git a/eventd/tests/event_validation_tests.py b/eventd/tests/event_validation_tests.py
index 54c73e1..40e164f 100644
--- a/eventd/tests/event_validation_tests.py
+++ b/eventd/tests/event_validation_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import json
 from unittest import TestCase
diff --git a/exceptions.py b/exceptions.py
index 8c9427e..8987c55 100644
--- a/exceptions.py
+++ b/exceptions.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 
 class ConfigurationError(Exception):
diff --git a/logger.py b/logger.py
index d0b67ca..5b10282 100644
--- a/logger.py
+++ b/logger.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import logging
 from logging.handlers import RotatingFileHandler
diff --git a/lte_utils.py b/lte_utils.py
index 94a96d3..296bc7a 100644
--- a/lte_utils.py
+++ b/lte_utils.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from enum import Enum
 from typing import Optional
diff --git a/magma_configs/acs_common.yml b/magma_configs/acs_common.yml
index 28f630b..f757526 100644
--- a/magma_configs/acs_common.yml
+++ b/magma_configs/acs_common.yml
@@ -1,3 +1,8 @@
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
 bandwidthMhz: 100
 specialSubframePattern: 7
 earfcndl: 44490
diff --git a/magma_configs/control_proxy.yml b/magma_configs/control_proxy.yml
index f245362..009c3b9 100644
--- a/magma_configs/control_proxy.yml
+++ b/magma_configs/control_proxy.yml
@@ -1,15 +1,7 @@
----
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
 #
-# 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.
+# SPDX-License-Identifier: BSD-3-Clause
 
 # nghttpx config will be generated here and used
 nghttpx_config_location: /var/tmp/nghttpx.conf
diff --git a/magma_configs/enodebd.yml b/magma_configs/enodebd.yml.example
similarity index 66%
rename from magma_configs/enodebd.yml
rename to magma_configs/enodebd.yml.example
index 346a6ed..03ee2b4 100644
--- a/magma_configs/enodebd.yml
+++ b/magma_configs/enodebd.yml.example
@@ -1,15 +1,8 @@
----
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
 #
-# Copyright 2020 The Magma Authors.
+# SPDX-License-Identifier: BSD-3-Clause
 
-# 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.
 #
 # log_level is set in mconfig. It can be overridden here
 
@@ -18,12 +11,12 @@
   port: 8000
 
 tr069:
-  interface: eth0 # NOTE: this value must be consistent with dnsmasq.conf
+  interface: enp6s18 # NOTE: this value must be consistent with dnsmasq.conf
   port: 48080
   perf_mgmt_port: 8081
   # NOTE: this is the IP which enodeb will communicate with enodebd
   #       if this is ever changed in dnsd.yml, this needs to be updated too
-  public_ip: 18.116.99.179
+  public_ip: 127.0.0.1
 
 ssl:
   key: "./enodebd.key"
diff --git a/magma_configs/magmad.yml b/magma_configs/magmad.yml
index ecbafc4..0f92ab5 100644
--- a/magma_configs/magmad.yml
+++ b/magma_configs/magmad.yml
@@ -1,16 +1,8 @@
----
-################################################################################
-# Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-# 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.
-################################################################################
 
 # log_level is set in mconfig. it can be overridden here
 
diff --git a/magma_configs/serial_number/2009CW5000019.yml b/magma_configs/serial_number/2009CW5000019.yml
deleted file mode 100644
index 140781f..0000000
--- a/magma_configs/serial_number/2009CW5000019.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-bandwidthMhz: 100
-specialSubframePattern: 7
-earfcndl: 44490
-plmnidList: "305010"
-pci: "100,101"
-allowEnodebTransmit: False
-subframeAssignment: 2
-cell_id: 1
-mme_address: 172.21.143.206
-mme_port: 36412
-
-cell:
-  DL bandwidth: 100
-  UL bandwidth: 100
-  Admin state: 0
-  Periodic inform interval: 180
-  Perf mgmt enable: 0
-  Perf mgmt upload interval: 900
-  enable_cwmp: True
-  tac: 501
-  tac2: 501
-  # RRM / CA
-  earfcndl1: 55440
-  earfcnul1: 55440
-  earfcndl2: 55640
-  earfcnul2: 55640
-  earfcndl_list: "55440,55640"
-  earfcnul_list: "55440,55640"
-  carrier_agg_enable: False
-  carrier_number: 2
-  contiguous_cc: 0
-  prim_source: "FREE_RUNNING"
-  # RF
-  freq_band_1: 48
-  freq_band_2: 48
-  freq_band_list: "48,48"
-  tx_power: 20
-  tunnel_type: "Device.IP.Interface.1.IPv4Address.1."
-
-sas:
-  sas_enabled: True
-  sas_cpi_enable: True
-  sas_manufacturer_prefix_enable: True
-  sas_server_url: "https://sas.goog/v1.2/"
-  sas_uid: "aether"
-  sas_category: "A"
-  sas_channel_type: "GAA"
-  sas_cert_subject: "/C=TW/O=Sercomm/OU=WInnForum CBSD Certificate/CN=P27-SCE4255W:2009CW5000019"
-  sas_location: "indoor"
-  sas_height_type: "AGL"
-  sas_fccid: "P27-SCE4255W"
-  sas_measure_capability: "RECEIVED_POWER_WITHOUT_GRANT"
-  sas_cpi_name: "onf-cpi"
-  sas_cpi_id: "GOOG-999999"
-
-  sas_antenna_azimuth: 0
-  sas_antenna_downtilt: 0
-  sas_antenna_gain: 5
-  sas_antenna_beamwidth: 360
-  sas_cpi_signature_data: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmY2NJZCI6IlAyNy1TQ0U0MjU1VyIsImNic2RTZXJpYWxOdW1iZXIiOiJTZXJjb21tLTIwMDlDVzUwMDAwMTkiLCJpbnN0YWxsYXRpb25QYXJhbSI6eyJsYXRpdHVkZSI6MzIuMzQ0NzUyLCJsb25naXR1ZGUiOi0xMTEuMDEyMzAyLCJoZWlnaHQiOjEsImhlaWdodFR5cGUiOiJBR0wiLCJpbmRvb3JEZXBsb3ltZW50Ijp0cnVlLCJhbnRlbm5hQXppbXV0aCI6MCwiYW50ZW5uYURvd250aWx0IjowLCJhbnRlbm5hR2FpbiI6NSwiYW50ZW5uYUJlYW13aWR0aCI6MzYwLCJob3Jpem9udGFsQWNjdXJhY3kiOjMsInZlcnRpY2FsQWNjdXJhY3kiOjMsImVpcnBDYXBhYmlsaXR5IjoyOH0sInByb2Zlc3Npb25hbEluc3RhbGxlckRhdGEiOnsiY3BpSWQiOiJHT09HLTAwMTIxMiIsImNwaU5hbWUiOiJXZWktWXUgQ2hlbiIsImluc3RhbGxDZXJ0aWZpY2F0aW9uVGltZSI6IjIwMjEtMDktMDlUMDA6MDA6MDBaIn19.ljSE95LcLwKXDgrFIX43M4BUTfmkl62KQvt0TNnsZh2SUgpw0ALQCEuSzh7KHRPOvVT5F8JjsKQeeewXSrHSLXPuPwCcxwYGDrwAp_SMiXJu7-ihL-ww_qOsZ-nu1W8alMe8oyxFiEYDN0957PBr9YP-Mj8uptVJ9VKJjf1bawzx0wihwXhTtioNMmvEO_zltD83BK14kaLM0aAcstgjHjNT7tIBE-0O3QGuN8o7jdGHxy9y7FUCPSmih2B5iu2ygVALGzYglnFebK873pp3mjKPh7XO776OjkNgYHHk5uCqf4JOf03z39Cn-CQVSnZTx-1LHV-mYJnhF4yk2R_chg"
diff --git a/magma_configs/service_registry.yml b/magma_configs/service_registry.yml
index 83735cc..dabcc9e 100644
--- a/magma_configs/service_registry.yml
+++ b/magma_configs/service_registry.yml
@@ -1,3 +1,8 @@
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
 ---
 services:
   # NOTE: do NOT include dash(-) in your service name. Use underscore instead.
diff --git a/main.py b/main.py
index c34aa0d..80637c4 100644
--- a/main.py
+++ b/main.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from threading import Thread
 from typing import List
@@ -27,7 +19,6 @@
 from state_machines.enb_acs_manager import StateMachineManager
 from orc8r.protos.service303_pb2 import State
 
-from enodebd_iptables_rules import set_enodebd_iptables_rule
 from rpc_servicer import EnodebdRpcServicer
 from stats_manager import StatsManager
 from tr069.server import tr069_server
@@ -94,9 +85,6 @@
         return get_operational_states(state_machine_manager, service.mconfig)
     service.register_operational_states_callback(get_enodeb_operational_states)
 
-    # Set eNodeBD iptables rules due to exposing public IP to eNodeB
-    service.loop.create_task(set_enodebd_iptables_rule())
-
     # Run the service loop
     service.run()
 
diff --git a/metrics.py b/metrics.py
index 877c4d9..36aaa28 100644
--- a/metrics.py
+++ b/metrics.py
@@ -1,3 +1,8 @@
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
 """
 Copyright 2020 The Magma Authors.
 
diff --git a/override_configs/gateway.mconfig.license b/override_configs/gateway.mconfig.license
new file mode 100644
index 0000000..254b95e
--- /dev/null
+++ b/override_configs/gateway.mconfig.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+
+SPDX-License-Identifier: BSD-3-Clause
\ No newline at end of file
diff --git a/proto_files/lte/protos/BUILD.bazel b/proto_files/lte/protos/BUILD.bazel
new file mode 100644
index 0000000..8eb5ee4
--- /dev/null
+++ b/proto_files/lte/protos/BUILD.bazel
@@ -0,0 +1,222 @@
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+load("@rules_proto//proto:defs.bzl", "proto_library")
+load("@rules_proto_grpc//cpp:defs.bzl", "cpp_grpc_library", "cpp_proto_library")
+
+package(default_visibility = ["//visibility:public"])
+
+cpp_proto_library(
+    name = "mconfigs_cpp_proto",
+    protos = [":mconfigs_proto"],
+    deps = ["//orc8r/protos:common_cpp_proto"],
+)
+
+proto_library(
+    name = "mconfigs_proto",
+    srcs = ["mconfig/mconfigs.proto"],
+    deps = ["//orc8r/protos:common_proto"],
+)
+
+cpp_grpc_library(
+    name = "abort_session_cpp_grpc",
+    protos = [":abort_session_proto"],
+)
+
+cpp_proto_library(
+    name = "abort_session_cpp_proto",
+    protos = [":abort_session_proto"],
+)
+
+proto_library(
+    name = "abort_session_proto",
+    srcs = ["abort_session.proto"],
+)
+
+cpp_proto_library(
+    name = "apn_cpp_proto",
+    protos = [":apn_proto"],
+)
+
+proto_library(
+    name = "apn_proto",
+    srcs = ["apn.proto"],
+)
+
+cpp_proto_library(
+    name = "subscriberdb_cpp_proto",
+    protos = [":subscriberdb_proto"],
+    deps = [
+        ":apn_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+        "//orc8r/protos:digest_cpp_proto",
+    ],
+)
+
+cpp_grpc_library(
+    name = "subscriberdb_cpp_grpc",
+    protos = [":subscriberdb_proto"],
+    deps = [
+        ":apn_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+        "//orc8r/protos:digest_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "subscriberdb_proto",
+    srcs = ["subscriberdb.proto"],
+    deps = [
+        ":apn_proto",
+        "//orc8r/protos:common_proto",
+        "//orc8r/protos:digest_proto",
+        "@protobuf//:field_mask_proto",
+    ],
+)
+
+cpp_proto_library(
+    name = "mobilityd_cpp_proto",
+    protos = [":mobilityd_proto"],
+    deps = [":subscriberdb_cpp_proto"],
+)
+
+cpp_grpc_library(
+    name = "mobilityd_cpp_grpc",
+    protos = [":mobilityd_proto"],
+    deps = [
+        ":subscriberdb_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "mobilityd_proto",
+    srcs = ["mobilityd.proto"],
+    deps = [
+        ":subscriberdb_proto",
+        "//orc8r/protos:common_proto",
+    ],
+)
+
+cpp_proto_library(
+    name = "policydb_cpp_proto",
+    protos = [":policydb_proto"],
+    deps = [
+        ":mobilityd_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+    ],
+)
+
+cpp_grpc_library(
+    name = "policydb_cpp_grpc",
+    protos = [":policydb_proto"],
+    deps = [
+        ":mobilityd_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "policydb_proto",
+    srcs = ["policydb.proto"],
+    deps = [
+        ":mobilityd_proto",
+        "//orc8r/protos:common_proto",
+    ],
+)
+
+cpp_proto_library(
+    name = "session_manager_cpp_proto",
+    protos = [":session_manager_proto"],
+    deps = [
+        ":apn_cpp_proto",
+        ":policydb_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+    ],
+)
+
+cpp_grpc_library(
+    name = "session_manager_cpp_grpc",
+    protos = [":session_manager_proto"],
+    deps = [
+        ":apn_cpp_proto",
+        ":policydb_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "session_manager_proto",
+    srcs = ["session_manager.proto"],
+    deps = [
+        ":apn_proto",
+        ":policydb_proto",
+        ":subscriberdb_proto",
+        "//orc8r/protos:common_proto",
+        "@protobuf//:timestamp_proto",
+    ],
+)
+
+cpp_proto_library(
+    name = "pipelined_cpp_proto",
+    protos = [":pipelined_proto"],
+    deps = [
+        ":apn_cpp_proto",
+        ":policydb_cpp_proto",
+        ":session_manager_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+    ],
+)
+
+cpp_grpc_library(
+    name = "pipelined_cpp_grpc",
+    protos = [":pipelined_proto"],
+    deps = [
+        ":apn_cpp_proto",
+        ":policydb_cpp_proto",
+        ":session_manager_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "pipelined_proto",
+    srcs = ["pipelined.proto"],
+    deps = [
+        ":apn_proto",
+        ":mobilityd_proto",
+        ":policydb_proto",
+        ":session_manager_proto",
+        ":subscriberdb_proto",
+        "//orc8r/protos:common_proto",
+    ],
+)
+
+cpp_grpc_library(
+    name = "spgw_service_cpp_grpc",
+    protos = [":spgw_service_proto"],
+    deps = [
+        "policydb_cpp_proto",
+        "subscriberdb_cpp_proto",
+    ],
+)
+
+cpp_proto_library(
+    name = "spgw_service_cpp_proto",
+    protos = [":spgw_service_proto"],
+    deps = [
+        ":policydb_cpp_proto",
+        ":subscriberdb_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "spgw_service_proto",
+    srcs = ["spgw_service.proto"],
+    deps = [
+        ":policydb_proto",
+        ":subscriberdb_proto",
+    ],
+)
diff --git a/proto_files/lte/protos/enodebd.proto b/proto_files/lte/protos/enodebd.proto
new file mode 100644
index 0000000..0a9385a
--- /dev/null
+++ b/proto_files/lte/protos/enodebd.proto
@@ -0,0 +1,120 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+import "orc8r/protos/service303.proto";
+import "orc8r/protos/common.proto";
+
+package magma.lte;
+
+option go_package = "magma/lte/cloud/go/protos";
+
+
+// --------------------------------------------------------------------------
+// Message Definitions for TR-069 message injection. This is used for manual
+// testing of the TR-069 server.
+// --------------------------------------------------------------------------
+message GetParameterRequest {
+  // Serial ID of eNodeB. Uniquely identifies the eNodeB.
+  string device_serial = 1;
+
+  // Fully qualified parameter name, e.g:
+  // InternetGatewayDevice.LANDevice.1.Hosts.
+  string parameter_name = 2;
+}
+
+message NameValue {
+  string name = 1;
+  // Note: parameter value is always passed back as string. Up to calling
+  // function to determine type
+  string value = 2;
+}
+message GetParameterResponse {
+  string device_serial = 1;
+  repeated NameValue parameters = 2;
+}
+
+message SetParameterRequest {
+  // Serial ID of eNodeB. Uniquely identifies the eNodeB.
+  string device_serial = 1;
+
+  // Fully qualified parameter name, e.g:
+  // InternetGatewayDevice.LANDevice.1.Hosts.
+  string parameter_name = 2;
+
+  // Data values for each data type
+  oneof value {
+    int32 value_int = 3;
+    string value_string = 4;
+    bool value_bool = 5;
+  }
+
+  // Key to be used at ACS discretion to determine when parameter was last
+  // updated
+  string parameter_key = 6;
+}
+
+message EnodebIdentity {
+  // Serial ID of eNodeB. Uniquely identifies the eNodeB.
+  string device_serial = 1;
+}
+
+message AllEnodebStatus {
+  repeated SingleEnodebStatus enb_status_list = 1;
+}
+
+message SingleEnodebStatus {
+  enum StatusProperty {
+    OFF = 0;
+    ON = 1;
+    UNKNOWN = 2;
+  }
+  string device_serial = 1;
+  string ip_address = 2;
+  StatusProperty connected = 3;
+  StatusProperty configured = 4;
+  StatusProperty opstate_enabled = 5;
+  StatusProperty rf_tx_on = 6;
+  StatusProperty gps_connected = 7;
+  StatusProperty ptp_connected = 8;
+  StatusProperty mme_connected = 9;
+  string gps_longitude = 10;
+  string gps_latitude = 11;
+  string fsm_state = 12;
+  StatusProperty rf_tx_desired = 13;
+}
+
+// --------------------------------------------------------------------------
+// Enodebd service definition.
+// --------------------------------------------------------------------------
+service Enodebd {
+
+  // Sends GetParameterValues message to ENodeB. TR-069 supports multiple
+  // parameter names per message, but only one is supported here.
+  rpc GetParameter (GetParameterRequest) returns (GetParameterResponse);
+
+  // Sends SetParameterValues message to ENodeB. TR-069 supports multiple
+  // parameter names per message, but only one is supported here.
+  rpc SetParameter (SetParameterRequest) returns (magma.orc8r.Void);
+
+  // Configure eNodeB based on enodebd config file
+  rpc Configure (EnodebIdentity) returns (magma.orc8r.Void);
+
+  // Reboot eNodeB
+  rpc Reboot (EnodebIdentity) returns (magma.orc8r.Void);
+
+  // Reboot every connected eNodeB
+  rpc RebootAll (magma.orc8r.Void) returns (magma.orc8r.Void);
+
+  // Get current status
+  rpc GetStatus (magma.orc8r.Void) returns (magma.orc8r.ServiceStatus);
+
+  // Get status info for all connected eNodeB devices
+  rpc GetAllEnodebStatus (magma.orc8r.Void) returns (AllEnodebStatus);
+
+  // Get status info of a single connected eNodeB device
+  rpc GetEnodebStatus (EnodebIdentity) returns (SingleEnodebStatus);
+}
diff --git a/proto_files/lte/protos/mconfig/mconfigs.proto b/proto_files/lte/protos/mconfig/mconfigs.proto
new file mode 100644
index 0000000..e3298b9
--- /dev/null
+++ b/proto_files/lte/protos/mconfig/mconfigs.proto
@@ -0,0 +1,515 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+import "orc8r/protos/common.proto";
+
+package magma.mconfig;
+option go_package = "magma/lte/cloud/go/protos/mconfig";
+
+// --------------------------------------------------------------------------
+// SentryConfig stores the network-wide Sentry.io configuration
+// --------------------------------------------------------------------------
+message SentryConfig {
+    // url_python initializes the Sentry Python SDK and sets the remote URL.
+    // If set to empty string, Sentry Python SDK will not be initialized.
+    string url_python = 1;
+    // url_native initializes the Sentry Native SDK for C/C++ and sets the
+    // remote URL. If set to empty string, Sentry Native SDK will not be
+    // initialized.
+    string url_native = 2;
+    // upload_mme_log decides whether MME service log file (/var/log/mme.log)
+    // is uploaded along with MME crashreports
+    bool upload_mme_log = 3;
+    // sample_rate sets the rate at which Python error events are sampled.
+    // sample_rate should be a number between 0 (0% of errors sent) and 1 (100%
+    // of errors sent)
+    float sample_rate = 4;
+}
+
+//------------------------------------------------------------------------------
+// EnodebD configs
+//------------------------------------------------------------------------------
+message EnodebD {
+    enum CSFBRat {
+        CSFBRAT_2G = 0;
+        CSFBRAT_3G = 1;
+    }
+
+    message FDDConfig {
+        int32 earfcndl = 1;
+        int32 earfcnul = 2;
+    }
+    message TDDConfig {
+        int32 earfcndl = 1;
+        // TDD subframe config parameter. See http://niviuk.free.fr/lte_tdd.php
+        int32 subframe_assignment = 2;
+        // TDD subframe config parameter. See http://niviuk.free.fr/lte_tdd.php
+        int32 special_subframe_pattern = 3;
+    }
+    message EnodebConfig {
+        // Device-unique serial ID. Used to identify the eNodeB, and ties the
+        // config to that device
+        int32 earfcndl = 1;
+        int32 subframe_assignment = 2;
+        int32 special_subframe_pattern = 3;
+        int32 pci = 4;
+        bool transmit_enabled = 5;
+        string device_class = 6;
+        int32 bandwidth_mhz = 7;
+        int32 tac = 8;
+        int32 cell_id = 9;
+        string ip_address = 10;
+    }
+
+    orc8r.LogLevel log_level = 1;
+
+    // Physical cell ID (0-504)
+    int32 pci = 2;
+    // Frequency channel number. See niviuk.free.fr/lte_band.php for mapping to
+    // frequency
+    int32 earfcndl = 3;
+    // Bandwidth in MHz, from set {1.4, 3, 5, 10, 15, 20}
+    int32 bandwidth_mhz = 4;
+    // Network operator identifier.
+    string plmnid_list = 5;
+    // TDD subframe config parameter. See http://niviuk.free.fr/lte_tdd.php
+    int32 subframe_assignment = 6;
+    // TDD subframe config parameter. See http://niviuk.free.fr/lte_tdd.php
+    int32 special_subframe_pattern = 7;
+    // Enable eNodeB
+    bool allow_enodeb_transmit = 8;
+    // Tracking area code. 16-bit
+    int32 tac = 9;
+    // RAT type (2G/3G), used by eNB
+    CSFBRat csfb_rat = 10;
+    // 2G RAT frequencies /ARFCNs for redirection, used by eNB
+    repeated int32 arfcn_2g = 11;
+    TDDConfig tdd_config = 12;
+    FDDConfig fdd_config = 13;
+    map<string, EnodebConfig> enb_configs_by_serial = 14;
+}
+
+//------------------------------------------------------------------------------
+// PipelineD configs
+//------------------------------------------------------------------------------
+message PipelineD {
+    enum NetworkServices {
+        METERING = 0 [deprecated=true];  // deprecated
+        DPI = 1;
+        ENFORCEMENT = 2;
+    }
+    orc8r.LogLevel log_level = 1;
+    // Range of IPs allocated to UEs
+    string ue_ip_block = 2;
+    // Whether NAT is enabled
+    bool nat_enabled = 3;
+    // repeated PolicyRule policy_rules = 5; // Policies have moved to policydb.proto
+    string default_rule_id = 6; // This should match a rule id in policy_rules
+    repeated NetworkServices services = 8;
+    message AllowedGrePeer {
+      string ip = 1;
+      uint32 key = 2;
+    }
+    repeated AllowedGrePeer allowed_gre_peers = 9;
+    message IPDRExportDst {
+      string ip = 1;
+      uint32 port = 2;
+    }
+    IPDRExportDst ipdr_export_dst = 10;
+    message LiUes {
+        repeated string imsis = 1;
+        repeated string msisdns = 2;
+        repeated string macs = 3;
+        repeated string ips = 4;
+        repeated string imeis = 5;
+    }
+    LiUes li_ues = 12;
+
+    string sgi_management_iface_vlan = 13;
+    string sgi_management_iface_ip_addr = 14;
+    string sgi_management_iface_gw = 15;
+
+    message HEConfig {
+        enum EncryptionAlgorithm {
+            RC4 = 0;
+            AES256_CBC_HMAC_MD5 = 1;
+            AES256_ECB_HMAC_MD5 = 2;
+            GZIPPED_AES256_ECB_SHA1 = 3;
+        }
+        enum HashFunction{
+            MD5 = 0;
+            HEX = 1;
+            SHA256 = 2;
+        }
+        enum EncodingType {
+            BASE64 = 0;
+            HEX2BIN = 1;
+        }
+
+        // enable_header_enrichment is true if header enrichment feature is
+        // enabled for gateway
+        bool enable_header_enrichment = 1;
+        bool enable_encryption = 2;
+        // encryption/hashing/encoding information for headers
+        EncryptionAlgorithm encryptionAlgorithm = 3;
+        HashFunction hashFunction = 4;
+        EncodingType encodingType = 5;
+        string encryption_key = 6;
+        string hmac_key = 7;
+    }
+    HEConfig he_config = 17;
+
+    // Enables 5G Standalone (SA) at a network level
+    bool enable5g_features = 18;
+    string upf_node_identifier = 19;
+
+    // SGi management IPv6 address with network mask
+    string sgi_management_iface_ipv6_addr = 20;
+    // IPv6 address of SGi management network GW
+    string sgi_management_iface_ipv6_gw = 21;
+
+    // DEPRECATED
+    reserved 4, 11;
+}
+
+//------------------------------------------------------------------------------
+// SessionD configs
+//------------------------------------------------------------------------------
+message SessionD {
+    orc8r.LogLevel log_level = 1;
+    // DEPRECATED
+    // Enable forwarding S6a related requests to Federated GW
+    bool relay_enabled = 2 [deprecated = true];
+    WalletExhaustDetection wallet_exhaust_detection = 3;
+    // Enable relaying Gx/Gy messages via FeG RPC
+    bool gx_gy_relay_enabled = 4;
+    // sentry_config stores the Sentry.io configuration for this service
+    SentryConfig sentry_config = 5;
+
+    // Enables 5G Standalone (SA) at a network level
+    bool enable5g_features = 6;
+}
+
+message WalletExhaustDetection {
+    // Enable the feature where session is terminated on wallet exhaust
+    bool terminate_on_exhaust = 1;
+    enum Method {
+        // If # of Gx Tracked Rules are > 0, then the wallet is still valid
+        GxTrackedRules = 0;
+    }
+    // How wallet exhast is detected on SessionD
+    Method method = 2;
+    // How long to wait before terminating a out-of-wallet subscriber on attach
+    uint32 timeout_ms = 3;
+}
+
+//------------------------------------------------------------------------------
+// PolicyDB configs
+//------------------------------------------------------------------------------
+message PolicyDB {
+    orc8r.LogLevel log_level = 1;
+}
+
+//------------------------------------------------------------------------------
+// RedirectD configs
+//------------------------------------------------------------------------------
+message RedirectD {
+    orc8r.LogLevel log_level = 1;
+}
+
+//------------------------------------------------------------------------------
+// MobilityD configs
+//------------------------------------------------------------------------------
+message MobilityD {
+    // UE allocator type.
+    enum IpAllocatorType {
+        IP_POOL = 0;
+        DHCP = 1;
+    }
+    orc8r.LogLevel log_level = 1;
+    // An IP block is a range of IP addresses specified by a network address and
+    // a prefix-length of the netmask. For example,
+    //    IPv4 IP block:      "192.168.0.0/24"
+    string ip_block = 2;
+    // ip allocation type, either dhcp or ip_pool
+    // default is ip_pool
+    IpAllocatorType ip_allocator_type = 3;
+    // Enable Static IP from subscriberDB
+    bool static_ip_enabled = 4;
+    // Enable multi APN IP allocation
+    bool multi_apn_ip_alloc = 5;
+
+    // IPv6 block for IPv6 allocator, for example:
+    // IPv6 IP block:      "fdee:5:6c::/48"
+    string ipv6_block = 10;
+    // Select ipv6 session prefix allocation type, example:
+    // "RANDOM", "HASH"
+    string ipv6_prefix_allocation_type = 11;
+}
+
+//------------------------------------------------------------------------------
+// MME configs
+//------------------------------------------------------------------------------
+message MME {
+    // (0)Turning off NonEPS service, (1)Both CSFB and SMS, (2)only SMS
+    enum NonEPSServiceControl {
+        NON_EPS_SERVICE_CONTROL_OFF = 0;
+        NON_EPS_SERVICE_CONTROL_CSFB_SMS = 1;
+        NON_EPS_SERVICE_CONTROL_SMS = 2;
+        NON_EPS_SERVICE_CONTROL_SMS_ORC8R = 3;
+    }
+
+    orc8r.LogLevel log_level = 1;
+    // Mobile country code
+    string mcc = 2;
+    // Mobile network code
+    string mnc = 3;
+    // [deprecated] Tracking area code. 16-bit
+    // Is overrideen by field 15
+    int32 tac = 4;
+    // MME group identifier - unique within a PLMN. 16-bit
+    int32 mme_gid = 5;
+    // MME code - unique within an MME group. 8-bit
+    int32 mme_code = 6;
+    // Enable DNS Caching. Will be filled by DnsD
+    bool enable_dns_caching = 7;
+    // DEPRECATED
+    // Enable credit control tracking with OCS and forwarding S6a related
+    // requests to Federated GW
+    bool relay_enabled = 8;
+    // For indicating one of the four modes
+    NonEPSServiceControl non_eps_service_control = 9;
+    // Mobile country code for CSFB
+    string csfb_mcc = 10;
+    // Mobile network code for CSFB
+    string csfb_mnc = 11;
+    // Location area code. 16-bit
+    int32 lac = 12;
+    // If relay_enabled is false, this determines whether cloud subscriberdb
+    // or local subscriberdb is used for authentication requests.
+    bool cloud_subscriberdb_enabled = 14;
+    // The Tracking Area Code of every connected eNodeB needs to be
+    // registered the MME.
+    // Overrides field 4 if this is not empty. Field 4 is in the process of
+    // being deprecated
+    repeated int32 attached_enodeb_tacs = 15;
+    // MME relative capacity - capacity within an MME group. 8-bit
+    int32 mme_relative_capacity = 16;
+
+    // DEPRECATED
+    // Use relay_enabled instead
+    // bool s6a_relay_enabled = 13;
+
+    // Primary DNS server
+    string dns_primary = 20;
+    // Secondary DNS server
+    string dns_secondary = 21;
+    // Whether NAT is enabled
+    bool nat_enabled = 22;
+
+    // Enable relaying S6a messages via FeG RPC
+    bool hss_relay_enabled = 23;
+
+    // Apn Correction feature
+    bool enable_apn_correction = 24;
+    message ApnCorrectionMap {
+      string imsi_prefix = 1;
+      string apn_override = 2;
+    }
+    repeated ApnCorrectionMap apn_correction_map_list = 25;
+
+    // P_CSCF IP address configs
+    string ipv4_p_cscf_address = 26;
+    string ipv6_p_cscf_address = 27;
+
+    // IPv6 DNS server
+    string ipv6_dns_address = 30;
+
+    // SGW S1U endpoint on AGW
+    string ipv4_sgw_s1u_addr = 31;
+
+    // PLMN restriction configs
+    message PlmnConfig {
+        string mcc = 1;
+        string mnc = 2;
+    }
+    repeated PlmnConfig restricted_plmns = 32;
+
+    message TacList {
+        repeated uint32 tac = 1;
+    }
+    map<string, TacList> service_area_maps = 33;
+
+    FederatedModeMap federated_mode_map = 34;
+
+    // IMEI restriction configs
+    message ImeiConfig {
+        string tac = 1;
+        string snr = 2;
+    }
+    repeated ImeiConfig restricted_imeis = 35;
+
+    // MME congestion control configs
+    bool congestion_control_enabled = 40;
+
+    // sentry_config stores the Sentry.io configuration for this service
+    SentryConfig sentry_config = 45;
+
+    // Enables 5G Standalone (SA) at a network level
+    bool enable5g_features = 46;
+
+    // AMF Slice Service Type (SST)
+    string default_slice_service_type = 47;
+
+    // AMF Slice Descriptor (SD)
+    string default_slice_differentiator = 48;
+
+    // AMF Name
+    string amf_name = 50;
+
+    // AMF Region ID
+    string amf_region_id = 51;
+
+    // AMF Set ID
+    string amf_set_id = 52;
+
+    // AMF pointer
+    string amf_pointer = 53;
+}
+
+message FederatedModeMap {
+    bool enabled = 1;
+    repeated ModeMapItem mapping = 2;
+}
+
+message ModeMapItem {
+    enum FederatedMode {
+        SPGW_SUBSCRIBER = 0;           // default mode is HSS + spgw_task
+        LOCAL_SUBSCRIBER = 1;          // will use subscriberDb + policydb
+        S8_SUBSCRIBER = 2;             // will use HSS (feg) + s8_task
+    }
+    FederatedMode mode = 1;
+    string plmn = 2;
+    string imsi_range = 3;
+    string apn = 4;
+}
+
+//------------------------------------------------------------------------------
+// SubscriberDB configs
+//------------------------------------------------------------------------------
+message SubscriberDB {
+    orc8r.LogLevel log_level = 1;
+    // Operator configuration field for LTE
+    bytes lte_auth_op = 2;
+    // Authentication management field for LTE
+    bytes lte_auth_amf = 3;
+
+    message SubscriptionProfile {
+        // Maximum uplink bit rate (AMBR-UL)
+        uint64 max_ul_bit_rate = 1;
+        // Maximum downlink bit rate (AMBR-DL)
+        uint64 max_dl_bit_rate = 2;
+    }
+    map<string, SubscriptionProfile> sub_profiles = 4;
+
+    // DEPRECATED
+    // Enable forwarding S6a related requests to Federated GW
+    bool relay_enabled = 5;
+
+    // Enable relaying S6a messages via FeG RPC
+    bool hss_relay_enabled = 6;
+
+    // Interval in seconds between gateway and cloud sync
+    uint32 sync_interval = 7;
+
+    // Enables 5G Standalone (SA) at a network level
+    bool enable5g_features = 8;
+}
+
+//------------------------------------------------------------------------------
+// LighttpD configs
+//------------------------------------------------------------------------------
+message LighttpD {
+    orc8r.LogLevel log_level = 1;
+    bool enable_caching = 2;
+}
+
+//------------------------------------------------------------------------------
+// MonitorD configs
+//------------------------------------------------------------------------------
+message MonitorD {
+    orc8r.LogLevel log_level = 1;
+    int32 polling_interval = 60;
+}
+
+//------------------------------------------------------------------------------
+// DPID configs
+//------------------------------------------------------------------------------
+message DPID {
+    orc8r.LogLevel log_level = 1;
+}
+
+//------------------------------------------------------------------------------
+// ConnectionD configs
+//------------------------------------------------------------------------------
+message ConnectionD {
+    orc8r.LogLevel log_level = 1;
+}
+
+//------------------------------------------------------------------------------
+// LIAgentD configs
+//------------------------------------------------------------------------------
+message LIAgentD {
+    orc8r.LogLevel log_level = 1;
+    repeated NProbeTask nprobe_tasks = 2;
+}
+
+message NProbeTask {
+    string task_id = 1;
+    string target_id = 2;
+    string target_type = 3;
+    string delivery_type = 4;
+    uint64 correlation_id = 5;
+    string domain_id = 6;
+}
+
+//------------------------------------------------------------------------------
+// DnsD configs
+//------------------------------------------------------------------------------
+message DnsD {
+    orc8r.LogLevel log_level = 1;
+    bool enable_caching = 2;
+    int32 localTTL = 3;
+    repeated GatewayDNSConfigRecordsItems records = 4;
+    bool dhcp_server_enabled = 5;
+}
+
+message GatewayDNSConfigRecordsItems {
+  repeated string a_record = 1;
+  repeated string aaaa_record = 2;
+  repeated string cname_record = 3;
+  string domain = 4;
+}
+
+//----------------------------------------------------------------------------
+// AgwD configs
+//----------------------------------------------------------------------------
+message AgwD {
+  enum LogLevel {
+    UNSET = 0;
+    DEBUG = 1;
+    INFO = 2;
+    WARN = 3;
+    ERROR = 4;
+  }
+  LogLevel log_level = 1;
+
+  string sctpd_downstream_service_target = 2;
+  string sctpd_upstream_service_target = 3;
+  string mme_sctpd_downstream_service_target = 4;
+  string mme_sctpd_upstream_service_target = 5;
+}
diff --git a/proto_files/lte/protos/s1ap_service.proto b/proto_files/lte/protos/s1ap_service.proto
new file mode 100644
index 0000000..c649c0a
--- /dev/null
+++ b/proto_files/lte/protos/s1ap_service.proto
@@ -0,0 +1,22 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+import "orc8r/protos/common.proto";
+
+package magma.lte;
+
+option go_package = "magma/lte/cloud/go/protos";
+
+service S1apService {
+    // Returns state of the S1 connected eNBs
+    rpc GetENBState (magma.orc8r.Void) returns (EnbStateResult) {}
+}
+
+// enb_state_map { eNB IDs -> # UEs connected }
+message EnbStateResult {
+    map<uint32, uint32> enb_state_map = 1;
+}
diff --git a/proto_files/orc8r/protos/BUILD.bazel b/proto_files/orc8r/protos/BUILD.bazel
new file mode 100644
index 0000000..10a1060
--- /dev/null
+++ b/proto_files/orc8r/protos/BUILD.bazel
@@ -0,0 +1,129 @@
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+load("@rules_proto//proto:defs.bzl", "proto_library")
+load("@rules_proto_grpc//cpp:defs.bzl", "cpp_grpc_library")
+load("@rules_proto_grpc//cpp:defs.bzl", "cpp_proto_library")
+
+package(default_visibility = ["//visibility:public"])
+
+cpp_proto_library(
+    name = "common_cpp_proto",
+    protos = [":common_proto"],
+)
+
+proto_library(
+    name = "common_proto",
+    srcs = ["common.proto"],
+)
+
+cpp_proto_library(
+    name = "digest_cpp_proto",
+    protos = [":digest_proto"],
+)
+
+proto_library(
+    name = "digest_proto",
+    srcs = ["digest.proto"],
+    deps = ["@protobuf//:any_proto"],
+)
+
+cpp_grpc_library(
+    name = "eventd_cpp_grpc",
+    protos = [":eventd_proto"],
+    deps = [":common_cpp_proto"],
+)
+
+proto_library(
+    name = "eventd_proto",
+    srcs = ["eventd.proto"],
+    deps = [":common_proto"],
+)
+
+cpp_grpc_library(
+    name = "directoryd_cpp_grpc",
+    protos = [":directoryd_proto"],
+    deps = [":common_cpp_proto"],
+)
+
+proto_library(
+    name = "directoryd_proto",
+    srcs = ["directoryd.proto"],
+    deps = [":common_proto"],
+)
+
+cpp_proto_library(
+    name = "redis_cpp_proto",
+    protos = [":redis_proto"],
+)
+
+proto_library(
+    name = "redis_proto",
+    srcs = ["redis.proto"],
+)
+
+proto_library(
+    name = "mconfigs_proto",
+    srcs = ["mconfig/mconfigs.proto"],
+    strip_import_prefix = "mconfig/",
+    deps = [":common_proto"],
+)
+
+cpp_proto_library(
+    name = "metrics_cpp_proto",
+    protos = [":metrics_proto"],
+)
+
+proto_library(
+    name = "metrics_proto",
+    srcs = ["prometheus/metrics.proto"],
+    strip_import_prefix = "prometheus/",
+)
+
+cpp_proto_library(
+    name = "metricsd_cpp_proto",
+    protos = [":metricsd_proto"],
+    deps = [
+        ":common_cpp_proto",
+        ":metrics_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "metricsd_proto",
+    srcs = ["metricsd.proto"],
+    deps = [
+        ":common_proto",
+        ":metrics_proto",
+    ],
+)
+
+cpp_grpc_library(
+    name = "service303_cpp_grpc",
+    protos = [":service303_proto"],
+    deps = [
+        ":common_cpp_proto",
+        ":metricsd_cpp_proto",
+    ],
+)
+
+cpp_proto_library(
+    name = "service303_cpp_proto",
+    protos = [":service303_proto"],
+    deps = [
+        ":common_cpp_proto",
+        ":metricsd_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "service303_proto",
+    srcs = ["service303.proto"],
+    deps = [
+        ":common_proto",
+        ":metricsd_proto",
+        "@protobuf//:wrappers_proto",
+    ],
+)
diff --git a/proto_files/orc8r/protos/common.proto b/proto_files/orc8r/protos/common.proto
new file mode 100644
index 0000000..43c153b
--- /dev/null
+++ b/proto_files/orc8r/protos/common.proto
@@ -0,0 +1,44 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+package magma.orc8r;
+option go_package = "magma/orc8r/lib/go/protos";
+
+message Void {
+}
+
+// -------------------------------------------------------------------------------
+// Bytes is a special message type used to marshal & unmarshal unknown types as is
+// -------------------------------------------------------------------------------
+message Bytes {
+  bytes val = 1;
+}
+
+// --------------------------------------------------------------------------
+// NetworkID uniquely identifies the network
+// --------------------------------------------------------------------------
+message NetworkID {
+  string id = 1;
+}
+
+// --------------------------------------------------------------------------
+// IDList is a generic definition of an array of IDs (network, gateway, etc.)
+// --------------------------------------------------------------------------
+message IDList {
+  repeated string ids = 1;
+}
+
+// --------------------------------------------------------------------------
+// Logging levels
+// --------------------------------------------------------------------------
+enum LogLevel {
+  DEBUG = 0;
+  INFO = 1;
+  WARNING = 2;
+  ERROR = 3;
+  FATAL = 4;
+}
diff --git a/proto_files/orc8r/protos/eventd.proto b/proto_files/orc8r/protos/eventd.proto
new file mode 100644
index 0000000..eaa5288
--- /dev/null
+++ b/proto_files/orc8r/protos/eventd.proto
@@ -0,0 +1,35 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+import "orc8r/protos/common.proto";
+
+package magma.orc8r;
+
+option go_package = "magma/orc8r/lib/go/protos";
+
+// --------------------------------------------------------------------------
+// EventService provides an interface for structured event logging.
+// --------------------------------------------------------------------------
+service EventService {
+  // Logs an event to FluentBit.
+  rpc LogEvent (Event) returns (Void) {}
+}
+
+// --------------------------------------------------------------------------
+// An Event encapsulates all information regarding an event and it's metadata.
+// --------------------------------------------------------------------------
+message Event {
+  // A user-specified string to categorize events
+  string stream_name = 1;
+  // Denotes the way an event should be deserialized.
+  // This should correspond to an event type in swagger_eventd.v1.yml
+  string event_type = 2;
+  // A user-specified non-unique identifier for events
+  string tag = 3;
+  // The event log serialized as JSON
+  string value = 4;
+}
diff --git a/proto_files/orc8r/protos/magmad.proto b/proto_files/orc8r/protos/magmad.proto
new file mode 100644
index 0000000..41192da
--- /dev/null
+++ b/proto_files/orc8r/protos/magmad.proto
@@ -0,0 +1,147 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+import "orc8r/protos/common.proto";
+import "orc8r/protos/mconfig.proto";
+import "google/protobuf/struct.proto";
+
+package magma.orc8r;
+option go_package = "magma/orc8r/lib/go/protos";
+
+
+message PingParams {
+  string host_or_ip = 1;
+  int32 num_packets = 2;
+}
+
+message TracerouteParams {
+  string host_or_ip = 1;
+  int32 max_hops = 2;
+  int32 bytes_per_packet = 3;
+}
+
+message NetworkTestRequest {
+  repeated PingParams pings = 1;
+  repeated TracerouteParams traceroutes = 2;
+}
+
+message PingResult {
+  string host_or_ip = 1;
+  int32 num_packets = 2;
+  string error = 3;
+  int32 packets_transmitted = 4;
+  int32 packets_received = 5;
+  float avg_response_ms = 6;
+}
+
+message TracerouteProbe {
+  string hostname = 1;
+  string ip = 2;
+  float rtt_ms = 3;
+}
+
+message TracerouteHop {
+  int32 idx = 1;
+  repeated TracerouteProbe probes = 2;
+}
+
+message TracerouteResult {
+  string error = 1;
+  string host_or_ip = 2;
+  repeated TracerouteHop hops = 3;
+}
+
+message NetworkTestResponse {
+  repeated PingResult pings = 1;
+  repeated TracerouteResult traceroutes = 2;
+}
+
+message GetGatewayIdResponse {
+  string gateway_id = 1;
+}
+
+message RestartServicesRequest {
+  repeated string services = 1;
+}
+
+message GenericCommandParams {
+  string command = 1;
+  google.protobuf.Struct params = 2;
+}
+
+message GenericCommandResponse {
+  google.protobuf.Struct response = 1;
+}
+
+message TailLogsRequest {
+  string service = 1;
+}
+
+message LogLine {
+  string line = 1;
+}
+
+message CheckStatelessResponse{
+  enum AGWMode {
+    INVALID = 0;
+    STATELESS = 1;
+    STATEFUL = 2;
+    CORRUPT = 3;
+  }
+  AGWMode agw_mode = 1;
+}
+
+message ConfigureStatelessRequest {
+  enum Cmd {
+    CHECK = 0;
+    DISABLE = 1;
+    ENABLE = 2;
+  }
+  Cmd config_cmd = 1;
+}
+
+// --------------------------------------------------------------------------
+// Magmad service definition.
+// --------------------------------------------------------------------------
+service Magmad {
+
+  // Starts all magma services
+  rpc StartServices (Void) returns (Void) {}
+
+  // Stops all magma services
+  rpc StopServices (Void) returns (Void) {}
+
+  // Reboot the gateway device
+  rpc Reboot (Void) returns (Void) {}
+
+  // Restart specified magma services
+  rpc RestartServices (RestartServicesRequest) returns (Void) {}
+
+  // Updates AG configs and restarts affected AG services
+  rpc SetConfigs (GatewayConfigs) returns (Void) {}
+
+  // Get current AG configs
+  rpc GetConfigs (Void) returns (GatewayConfigs) {}
+
+  // Execute some network commands to check gateway network health
+  rpc RunNetworkTests (NetworkTestRequest) returns (NetworkTestResponse) {}
+
+  // Get gateway hardware ID
+  rpc GetGatewayId (Void) returns (GetGatewayIdResponse) {}
+
+  // Execute generic command
+  rpc GenericCommand (GenericCommandParams) returns (GenericCommandResponse) {}
+
+  // Get stream of logs
+  rpc TailLogs (TailLogsRequest) returns (stream LogLine) {}
+
+  // CheckStateless returns whether AGW is stateless or stateful
+  rpc CheckStateless (Void) returns (CheckStatelessResponse) {}
+
+  // ConfigureStateless configures the stateless mode of AGW
+  rpc ConfigureStateless (ConfigureStatelessRequest) returns (Void) {}
+}
diff --git a/proto_files/orc8r/protos/mconfig.proto b/proto_files/orc8r/protos/mconfig.proto
new file mode 100644
index 0000000..740ab6a
--- /dev/null
+++ b/proto_files/orc8r/protos/mconfig.proto
@@ -0,0 +1,51 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+import "google/protobuf/any.proto";
+
+package magma.orc8r;
+option go_package = "magma/orc8r/lib/go/protos";
+
+// --------------------------------------------------------------------------
+// GatewayConfigs structure is a container for all Access Gateway's (AG) Cloud
+// Managed Configs (CMC). Each and every field of GatewayConfigs represents
+// one AG service config
+// --------------------------------------------------------------------------
+// NOTE: a service config field name (control_proxy, enodebd, etc.) must match
+//       the corresponding gateway service's name exactly
+message GatewayConfigs {
+    map<string, google.protobuf.Any> configs_by_key = 10;
+
+    GatewayConfigsMetadata metadata = 11;
+}
+
+// Deterministic hash of a serialized GatewayConfigs proto
+message GatewayConfigsDigest {
+    // Hexadecimal MD5 hash of the UTF-8-encoded stringified full mconfigs
+    string md5_hex_digest = 1;
+}
+
+// Metadata about the configs.
+message GatewayConfigsMetadata {
+    // Unix timestamp of Cloud at the time of config generation.
+    uint64 created_at = 11;
+    GatewayConfigsDigest digest = 12;
+}
+
+// Wraps a gateway config and a stream offset that the config was computed
+// from
+message OffsetGatewayConfigs {
+    GatewayConfigs configs = 1;
+    int64 offset = 2;
+}
+
+// Stream request passed as extra args to the streaming mconfig streamer policy.
+// Contains a single field, the offset of the mconfig currently stored on
+// the device.
+message MconfigStreamRequest {
+    int64 offset = 1;
+}
diff --git a/proto_files/orc8r/protos/mconfig/mconfigs.proto b/proto_files/orc8r/protos/mconfig/mconfigs.proto
new file mode 100644
index 0000000..9e5acb5
--- /dev/null
+++ b/proto_files/orc8r/protos/mconfig/mconfigs.proto
@@ -0,0 +1,112 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+import "orc8r/protos/common.proto";
+
+package magma.mconfig;
+option go_package = "magma/orc8r/lib/go/protos/mconfig";
+
+// ===========================================================================
+// Service-specific configs
+// ===========================================================================
+
+
+//------------------------------------------------------------------------------
+// Control Proxy configs
+//------------------------------------------------------------------------------
+message ControlProxy {
+    orc8r.LogLevel log_level = 1;
+}
+
+//------------------------------------------------------------------------------
+// MagmaD configs
+//------------------------------------------------------------------------------
+
+message ImageSpec {
+    string name = 1;
+    int64 order = 2;
+}
+
+message MagmaD {
+    orc8r.LogLevel log_level = 1;
+    // Interval for the gateways to send checkin rpc calls to the cloud.
+    int32 checkin_interval = 2;
+    // Checkin rpc timeout
+    int32 checkin_timeout = 3;
+    // Enables autoupgrading of the magma package
+    bool autoupgrade_enabled = 4;
+    // Interval to poll for package upgrades
+    int32 autoupgrade_poll_interval = 5;
+    // The magma package version the gateway should upgrade to
+    string package_version = 6;
+    // List of upgrade images
+    repeated ImageSpec images = 7;
+
+    // For streamer, should be left unused by gateway
+    string tier_id = 8;
+
+    map<string, bool> feature_flags = 9;
+
+    // List of dynamic_services
+    repeated string dynamic_services = 10;
+}
+
+//------------------------------------------------------------------------------
+// EventD configs
+//------------------------------------------------------------------------------
+message EventD {
+    orc8r.LogLevel log_level = 1;
+    // The verbosity level for events.
+    // All events less than or equal to this verbosity will be logged.
+    int32 event_verbosity = 2;
+}
+
+message DirectoryD {
+    orc8r.LogLevel log_level = 1;
+}
+
+//------------------------------------------------------------------------------
+// MetricsD configs
+//------------------------------------------------------------------------------
+message MetricsD {
+    orc8r.LogLevel log_level = 1;
+}
+
+//------------------------------------------------------------------------------
+// State configs
+//------------------------------------------------------------------------------
+message State {
+    orc8r.LogLevel log_level = 1;
+    uint32 sync_interval = 2;
+}
+
+//------------------------------------------------------------------------------
+// Fluent Bit configs
+//------------------------------------------------------------------------------
+message FluentBit {
+    map<string, string> extra_tags = 1;
+
+    uint32 throttle_rate = 10;
+    uint32 throttle_window = 11;
+    string throttle_interval = 12;
+
+    map<string, string> files_by_tag = 20;
+}
+
+//------------------------------------------------------------------------------
+// OpenVPN client configs
+//------------------------------------------------------------------------------
+message OpenVPN {
+    bool enable_shell_access = 1;
+}
+
+//------------------------------------------------------------------------------
+// CtraceD configs
+//------------------------------------------------------------------------------
+message CtraceD {
+    orc8r.LogLevel log_level = 1;
+}
diff --git a/proto_files/orc8r/protos/metricsd.proto b/proto_files/orc8r/protos/metricsd.proto
new file mode 100644
index 0000000..9542201
--- /dev/null
+++ b/proto_files/orc8r/protos/metricsd.proto
@@ -0,0 +1,238 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+package magma.orc8r;
+
+import "metrics.proto";
+import "orc8r/protos/common.proto";
+
+option go_package = "magma/orc8r/lib/go/protos";
+
+// For each metric name tracked, we use an enum
+enum MetricName {
+  // Prometheus metrics
+  process_start_time_seconds     = 0;
+  process_virtual_memory_bytes   = 1;
+  process_resident_memory_bytes  = 2;
+  process_cpu_seconds_total      = 3;
+  process_open_fds               = 4;
+  process_max_fds                = 5;
+
+  // subscriberdb metrics
+  s6a_auth_success               = 6;
+  s6a_auth_failure               = 7;
+  s6a_location_update            = 8;
+  diameter_capabilities_exchange = 9;
+  diameter_watchdog              = 10;
+  diameter_disconnect            = 11;
+
+  // More prometheus metrics
+  python_info                    = 50;
+
+  // Metricsd metrics
+  service_metrics_collected      = 60;
+  process_uptime_seconds         = 61;
+
+  // mobilityd metrics
+  ip_address_allocated           = 100;
+  ip_address_released            = 101;
+  ip_already_allocated           = 102;
+  ip_allocation_failure          = 103;
+
+  // enodebd metrics
+  enodeb_mgmt_connected          = 200;
+  enodeb_opstate_enabled         = 201;
+  enodeb_rf_tx_enabled           = 202;
+  enodeb_gps_connected           = 203;
+  enodeb_ptp_connected           = 204;
+  enodeb_mme_connected           = 205;
+  rrc_estab_attempts             = 206;
+  rrc_estab_successes            = 207;
+  pdcp_user_plane_bytes_ul       = 208;
+  pdcp_user_plane_bytes_dl       = 209;
+  rrc_reestab_attempts           = 210;
+  rrc_reestab_attempts_reconf_fail = 211;
+  rrc_reestab_attempts_ho_fail   = 212;
+  rrc_reestab_attempts_other     = 213;
+  rrc_reestab_successes          = 214;
+  erab_estab_attempts            = 215;
+  erab_estab_successes           = 216;
+  erab_estab_failures            = 217;
+  erab_release_requests          = 218;
+  erab_release_requests_user_inactivity = 219;
+  erab_release_requests_normal   = 220;
+  erab_release_requests_radio_resources_not_available = 221;
+  erab_release_requests_reduce_load = 222;
+  erab_release_requests_fail_in_radio_proc = 223;
+  erab_release_requests_eutran_reas = 224;
+  erab_release_requests_radio_radio_conn_lost = 225;
+  erab_release_requests_oam_intervention = 226;
+  enodeb_mgmt_configured         = 227;
+  enodeb_reboot_timer_active     = 228;
+  enodeb_reboots                 = 229;
+  enodeb_rf_tx_desired           = 230;
+
+  // Kernsnoopd metrics
+  magma_bytes_sent_total         = 260;
+  linux_bytes_sent_total         = 261;
+
+  // Magmad metrics
+  magmad_ping_rtt_ms             = 300;
+  cpu_percent                    = 301;
+  swap_memory_percent            = 302;
+  virtual_memory_percent         = 303;
+  disk_percent                   = 304;
+  bytes_sent                     = 305;
+  bytes_received                 = 306;
+  temperature                    = 307;
+  checkin_status                 = 308;
+  streamer_responses             = 309;
+  mem_total                      = 310;
+  mem_available                  = 311;
+  mem_used                       = 312;
+  mem_free                       = 313;
+  bootstrap_exception            = 314;
+  upgrader2_time_taken           = 315;
+  upgrader2_error                = 316;
+  upgrader2_prepared             = 317;
+  upgrader2_downloaded           = 318;
+  upgrader2_canary               = 319;
+  upgrader2_stable               = 320;
+  upgrader2_idle                 = 321;
+  unexpected_service_restarts    = 322;
+  unattended_upgrade_status      = 323;
+  service_restart_status         = 324;
+
+  // Pipelined metrics
+  dp_send_msg_error              = 350;
+  arp_default_gw_mac_error       = 351;
+  openflow_error_msg             = 352;
+  unknown_pkt_direction          = 353;
+  network_iface_status           = 354;
+  enforcement_rule_install_fail  = 355;
+  enforcement_stats_rule_install_fail = 356;
+
+  ///////////////////////////////
+  // GATEWAY FAILURES & ALERTS //
+  ///////////////////////////////
+  mme_restarted                  = 400;
+  s1_reset_from_enb              = 401;
+
+  // SCTP
+  sctp_reset                     = 410;
+  sctp_shutdown                  = 411;
+
+  // s6a
+  s6a_subscriberdb_connection_failure = 420;
+  s6a_auth_info_response_timer_expired = 421;
+
+  // UE attach, Serivce Request
+  duplicate_attach_request       = 430;
+  initial_context_setup_failure_received = 431;
+  initial_context_setup_request_timer_expired = 432;
+  nas_attach_accept_timer_expired = 433;
+  nas_auth_rsp_timer_expired = 434;
+  nas_security_mode_command_timer_expired = 435;
+  security_mode_reject_received  = 436;
+  authentication_failure         = 437; // cause=mac_failure,resync,amf
+  mme_spgw_create_session_req    = 438;
+  mme_spgw_create_session_rsp    = 439;
+  mme_spgw_delete_session_req    = 440;
+  mme_spgw_delete_session_rsp    = 441;
+
+  // UE S1AP context
+  ue_context_release_request     = 450;
+  ue_context_release_command_timer_expired = 451;
+
+  // Detach
+  implicit_detach_timer_expired  = 452;
+
+  // eNB SCTP shutdown context clean up time
+  enb_sctp_shutdown_ue_clean_up_timer_expired  = 453;
+
+  // Other errors
+  s1ap_error_ind_received        = 480;
+  gtpu_error_ind_received        = 481;
+  nas_non_delivery_indication_received = 482;
+  emm_status_received            = 483;
+  emm_status_sent                = 484;
+
+  ////////////////////////
+  // GATEWAY PROCEDURES //
+  ////////////////////////
+  mme_new_association            = 500;
+  ue_attach                      = 501; // result=failure,accept,complete
+  service_request                = 502;
+  ue_detach                      = 503; // cause=network_initiated,
+                                        // deregister_ue,implicit_detach,
+                                        // ue_initiated
+  spgw_create_session            = 504;
+  spgw_delete_session            = 505;
+  ue_pdn_connection              = 506;
+  tracking_area_update           = 507;
+  s1_setup                       = 508;
+
+  // Generic service metrics
+  service_errors                 = 550;
+}
+
+// Possible labels, used as metric_name{label_name=label_value}
+enum MetricLabelName {
+  result                         = 0;
+  cause                          = 1;
+  tau_type                       = 2;
+  pdn_type                       = 3;
+  action                         = 4;
+  host                           = 5; // magmad_ping_rtt_ms
+  metric                         = 6; // magmad_ping_rtt_ms
+  patchlevel                     = 7; // python_info
+  minor                          = 8; // python_info
+  major                          = 9; // python_info
+  version                        = 10; // python_info
+  implementation                 = 11; // python_info
+  sensor                         = 12; // magmad_temperature
+  error_code                     = 13;
+  error_type                     = 14;
+  iface_name                     = 15; // pipelined network_iface_status
+  service_name                   = 16; // magmad unexpected_service_restarts
+  rule_id                        = 17; // pipelined rule install failures
+  imsi                           = 18; // pipelined rule install failures
+  dest_service                   = 19; // kernsnoopd name of destination service
+  binary_name                    = 20; // kernsnoopd name of linux binary
+}
+
+message MetricsContainer {
+  string gatewayId = 1;
+  // TODO: we should strip this out of metricsd (or duplicate it ourselves)
+  // Prometheus 2 no longer supports protobuf client model
+  repeated io.prometheus.client.MetricFamily family = 2;
+}
+
+message PushedMetric {
+  string   metricName        = 1;
+  double   value             = 2;
+  int64    timestampMS       = 3;
+  repeated LabelPair labels  = 4;
+}
+
+message LabelPair {
+  string name  = 1;
+  string value = 2;
+}
+
+message PushedMetricsContainer {
+  string   networkId = 1;
+  repeated PushedMetric metrics = 2;
+}
+
+service MetricsController {
+  // Report a collection of metrics from a service
+  rpc Collect(MetricsContainer) returns (Void) {}
+
+  // Push a collection of metrics to metricsd
+  rpc Push(PushedMetricsContainer) returns (Void) {}
+}
diff --git a/proto_files/orc8r/protos/prometheus/metrics.proto b/proto_files/orc8r/protos/prometheus/metrics.proto
new file mode 100644
index 0000000..87ae0d7
--- /dev/null
+++ b/proto_files/orc8r/protos/prometheus/metrics.proto
@@ -0,0 +1,82 @@
+// SPDX-FileCopyrightText: 2013 Prometheus Team.
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: Apache-2.0
+
+syntax = "proto2";
+
+package io.prometheus.client;
+option java_package = "io.prometheus.client";
+
+// !!!!!!!!!!!!!
+// DO NOT MODIFY
+// !!!!!!!!!!!!!
+// This file is a copy of the open source prometheus library.
+// https://github.com/prometheus/client_model/blob/master/metrics.proto
+// The 'go_package' change is made locally, and needs to be upstreamed.
+option go_package = "github.com/prometheus/client_model/go";
+
+message LabelPair {
+  optional string name  = 1;
+  optional string value = 2;
+}
+
+enum MetricType {
+  COUNTER    = 0;
+  GAUGE      = 1;
+  SUMMARY    = 2;
+  UNTYPED    = 3;
+  HISTOGRAM  = 4;
+}
+
+message Gauge {
+  optional double value = 1;
+}
+
+message Counter {
+  optional double value = 1;
+}
+
+message Quantile {
+  optional double quantile = 1;
+  optional double value    = 2;
+}
+
+message Summary {
+  optional uint64   sample_count = 1;
+  optional double   sample_sum   = 2;
+  repeated Quantile quantile     = 3;
+}
+
+message Untyped {
+  optional double value = 1;
+}
+
+message Histogram {
+  optional uint64 sample_count = 1;
+  optional double sample_sum   = 2;
+  repeated Bucket bucket       = 3; // Ordered in increasing order of upper_bound, +Inf bucket is optional.
+}
+
+message Bucket {
+  optional uint64 cumulative_count = 1; // Cumulative in increasing order.
+  optional double upper_bound = 2;      // Inclusive.
+}
+
+message Metric {
+  repeated LabelPair label        = 1;
+  optional Gauge     gauge        = 2;
+  optional Counter   counter      = 3;
+  optional Summary   summary      = 4;
+  optional Untyped   untyped      = 5;
+  optional Histogram histogram    = 7;
+  optional int64     timestamp_ms = 6;
+}
+
+message MetricFamily {
+  optional string     name   = 1;
+  optional string     help   = 2;
+  optional MetricType type   = 3;
+  repeated Metric     metric = 4;
+}
diff --git a/proto_files/orc8r/protos/redis.proto b/proto_files/orc8r/protos/redis.proto
new file mode 100644
index 0000000..489cc0d
--- /dev/null
+++ b/proto_files/orc8r/protos/redis.proto
@@ -0,0 +1,16 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+package magma.orc8r;
+option go_package = "magma/orc8r/lib/go/protos";
+
+message RedisState {
+    bytes serialized_msg = 1;
+    uint64 version = 2;
+    bool is_garbage = 3;
+}
+
diff --git a/proto_files/orc8r/protos/service303.proto b/proto_files/orc8r/protos/service303.proto
new file mode 100644
index 0000000..143af45
--- /dev/null
+++ b/proto_files/orc8r/protos/service303.proto
@@ -0,0 +1,132 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+package magma.orc8r;
+
+import "orc8r/protos/common.proto";
+import "orc8r/protos/metricsd.proto";
+import "google/protobuf/wrappers.proto";
+
+option go_package = "magma/orc8r/lib/go/protos";
+
+// --------------------------------------------------------------------------
+// Service status messages
+// --------------------------------------------------------------------------
+
+message EnodebdStatus {
+  // For bools, parameter is not set if result can't be determined
+  google.protobuf.BoolValue enodeb_connected = 1;
+  google.protobuf.BoolValue opstate_enabled = 2;
+  google.protobuf.BoolValue rf_tx_on = 3;
+  google.protobuf.BoolValue gps_connected = 4;
+  google.protobuf.BoolValue ptp_connected = 5;
+  google.protobuf.BoolValue mme_connected = 6;
+  google.protobuf.BoolValue enodeb_configured = 7;
+  google.protobuf.FloatValue gps_latitude = 8;
+  google.protobuf.FloatValue gps_longitude = 9;
+  google.protobuf.BoolValue rf_tx_desired = 10;
+}
+
+message ServiceStatus {
+  // Metadata from the services that will be sent to the cloud through checkin
+  map<string, string> meta = 2;
+}
+
+message ServiceInfo {
+  string name = 1;
+
+  string version = 2;
+
+  enum ServiceState {
+    UNKNOWN = 0;
+    STARTING = 1;
+    ALIVE = 2;
+    STOPPING = 3;
+    STOPPED = 4;
+  }
+  ServiceState state = 3;
+
+  ServiceStatus status = 4;
+
+  // Gives information about whether the application is usable. Though the
+  // process may have started, the connections may not be set up. APP_HEALTHY in
+  // this case means the application is entirely usable
+  enum ApplicationHealth {
+    APP_UNKNOWN = 0;
+    APP_UNHEALTHY = 1;
+    APP_HEALTHY = 2;
+  }
+  ApplicationHealth health = 5;
+
+  // Time when the service was started (in seconds since epoch)
+  uint64 start_time_secs = 6;
+}
+
+message LogLevelMessage {
+    LogLevel level = 1;
+}
+
+message LogVerbosity {
+  int32 verbosity = 1;
+}
+
+message ReloadConfigResponse {
+  enum ReloadConfigResult {
+    RELOAD_UNKNOWN = 0;
+    RELOAD_SUCCESS = 1;
+    RELOAD_FAILURE = 2;
+    RELOAD_UNSUPPORTED = 3;
+  }
+  ReloadConfigResult result = 1;
+}
+
+message State {
+    // Type determines how the value is deserialized and validated on the cloud service side
+    string type = 1;
+    string deviceID = 2;
+    // Value contains the operational state json-serialized.
+    bytes value = 3;
+    uint64 version = 4;
+}
+
+message GetOperationalStatesResponse {
+  repeated State states = 1;
+}
+
+// --------------------------------------------------------------------------
+// Service303 interface definition.
+//
+// Service303 is named after fb303, which was named after TB-303
+// https://en.wikipedia.org/wiki/Roland_TB-303.
+//
+// The Service303 interface implements a set of functionalities which
+// all Magma services expose.
+// --------------------------------------------------------------------------
+service Service303 {
+
+  // Returns the service level info like name, version, state, status, etc.
+  //
+  rpc GetServiceInfo (Void) returns (ServiceInfo) {}
+
+  // Request to stop the service gracefully.
+  //
+  rpc StopService (Void) returns (Void) {}
+
+  // Collects metrics from the service
+  rpc GetMetrics (Void) returns (MetricsContainer) {}
+
+  // Set logging level
+  rpc SetLogLevel (LogLevelMessage) returns (Void) {}
+
+  // Set logging verbosity The larger, the more verbose. default 0
+  rpc SetLogVerbosity (LogVerbosity) returns (Void) {}
+
+  // Requests service reloads config files loaded on startup (<servicename>.yml)
+  rpc ReloadServiceConfig (Void) returns (ReloadConfigResponse) {}
+
+  // Returns the  operational states of devices managed by this service.
+  rpc GetOperationalStates (Void) returns (GetOperationalStatesResponse) {}
+}
diff --git a/proto_files/orc8r/protos/service_status.proto b/proto_files/orc8r/protos/service_status.proto
new file mode 100644
index 0000000..129d889
--- /dev/null
+++ b/proto_files/orc8r/protos/service_status.proto
@@ -0,0 +1,48 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+package magma.orc8r;
+
+option go_package = "magma/orc8r/lib/go/protos";
+
+// --------------------------------------------------------------------------
+// Service exit status
+// --------------------------------------------------------------------------
+
+message ServiceExitStatus {
+  // ServiceResult enumeration as defined in service "result" by systemd
+  enum ServiceResult {
+    UNUSED = 0;
+    SUCCESS = 1;
+    PROTOCOL = 2;
+    TIMEOUT = 3;
+    EXIT_CODE = 4;
+    SIGNAL = 5;
+    CORE_DUMP = 6;
+    WATCHDOG = 7;
+    START_LIMIT_HIT = 8;
+    RESOURCES = 9;
+  }
+  ServiceResult latest_service_result = 1;
+
+  // ExitCode enumeration as defined in service "result" by systemd
+  enum ExitCode {
+    UNUSED_EXIT_CODE = 0;
+    EXITED = 1;
+    KILLED = 2;
+    DUMPED = 3;
+  }
+  ExitCode latest_exit_code = 2;
+
+  // Optional return code returned by the service during exit
+  uint32 latest_rc = 3;
+
+  // Clean exit, e.g. SIGNKILL
+  uint32 num_clean_exits = 4;
+  // Unclean exit e.g. CORE_DUMP or non zero exit code.
+  uint32 num_fail_exits = 5;
+}
\ No newline at end of file
diff --git a/proto_files/orc8r/protos/streamer.proto b/proto_files/orc8r/protos/streamer.proto
new file mode 100644
index 0000000..ac4795b
--- /dev/null
+++ b/proto_files/orc8r/protos/streamer.proto
@@ -0,0 +1,59 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+package magma.orc8r;
+
+import "google/protobuf/any.proto";
+
+option go_package = "magma/orc8r/lib/go/protos";
+
+// Streamer provides a pipeline for the cloud to push the updates to the
+// gateway as and when the update happens.
+//
+// The Streamer interface defines the semantics and consistency guarantees
+// between the cloud and the gateway while abstracting the details of how
+// it's implemented in the cloud and what the gateway does with the updates.
+//
+// - The gateways call the GetUpdates() streaming API with a StreamRequest
+//   indicating the stream name and the offset to continue streaming from.
+// - The cloud sends a stream of DataUpdateBatch containing a batch of updates.
+// - If resync is true, then the gateway can cleanup all its data and add
+//   all the keys (the batch is guaranteed to contain only unique keys).
+// - If resync is false, then the gateway can update the keys, or add new
+//   ones if the key is not already present.
+// - Key deletions are not yet supported (#15109350)
+service Streamer {
+  // GetUpdates streams config updates from the cloud.
+  // The RPC call would be kept open to push new updates as they happen.
+  rpc GetUpdates (StreamRequest) returns (stream DataUpdateBatch) {}
+}
+
+message StreamRequest {
+  string gatewayId = 1;
+  // stream_name to attach to.
+  // E.g., subscriberdb, config, etc.
+  string stream_name = 2;
+  // extra_args contain any extra data to send up with the stream request.
+  // This value will be different per stream provider.
+  google.protobuf.Any extra_args = 3;
+}
+
+message DataUpdateBatch {
+  // updates to config values
+  repeated DataUpdate updates = 1;
+  // resync is true iff the updates would be a snapshot of all the contents
+  // in the cloud.
+  bool resync = 2;
+}
+
+message DataUpdate {
+  // key is the unique key for each item
+  string key = 1;
+  // value can be file contents, protobuf serialized message, etc.
+  // For key deletions, the value field would be absent.
+  bytes value = 2;
+}
diff --git a/requirements.txt b/requirements.txt
index 97556f1..3e92790 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,8 @@
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
 wheel==0.37.1
 aiohttp==3.6.2
 aiosignal==1.2.0
@@ -34,11 +39,10 @@
 sentry-sdk==1.4.3
 six==1.16.0
 snowflake==0.0.3
-spyne==2.13.16
+git+https://github.com/aweimeow/spyne.git@61f5c829979f369543a00ad410c2c60fb9ce8881
 toml==0.10.2
 typed-ast==1.4.3
 typing-extensions==3.10.0.2
 urllib3==1.26.7
 wrapt==1.13.3
 yarl==1.7.2
-cryptography==36.0.1
\ No newline at end of file
diff --git a/rpc_servicer.py b/rpc_servicer.py
index 30b3f43..9fb9913 100644
--- a/rpc_servicer.py
+++ b/rpc_servicer.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from typing import Any
 
diff --git a/s1ap_client.py b/s1ap_client.py
index e7e4dde..05430a1 100644
--- a/s1ap_client.py
+++ b/s1ap_client.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 from typing import Dict, Optional
 
 import grpc
diff --git a/state_machines/acs_state_utils.py b/state_machines/acs_state_utils.py
index e0e32cc..e35f37d 100644
--- a/state_machines/acs_state_utils.py
+++ b/state_machines/acs_state_utils.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from typing import Any, Dict, List, Optional
 
diff --git a/state_machines/enb_acs.py b/state_machines/enb_acs.py
index 24e24e7..ecaff6f 100644
--- a/state_machines/enb_acs.py
+++ b/state_machines/enb_acs.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 from abc import ABC, abstractmethod
 from asyncio import BaseEventLoop
 from time import time
diff --git a/state_machines/enb_acs_impl.py b/state_machines/enb_acs_impl.py
index 4a197d4..0bb1a96 100644
--- a/state_machines/enb_acs_impl.py
+++ b/state_machines/enb_acs_impl.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import traceback
 from abc import abstractmethod
diff --git a/state_machines/enb_acs_manager.py b/state_machines/enb_acs_manager.py
index 7ad6b02..d8b5947 100644
--- a/state_machines/enb_acs_manager.py
+++ b/state_machines/enb_acs_manager.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from typing import Any, List, Optional
 
@@ -62,6 +54,7 @@
                 return models.DummyInput()
 
         handler = self._get_handler(client_ip)
+
         if handler is None:
             logger.warning(
                 'Received non-Inform TR-069 message from unknown '
@@ -195,7 +188,12 @@
 
     @staticmethod
     def _get_client_ip(ctx: WsgiMethodContext) -> str:
-        return ctx.transport.req_env.get("REMOTE_ADDR", "unknown")
+
+        client_ip = ctx.transport.req_env.get("HTTP_X_REAL_IP", 
+            ctx.transport.req_env.get("REMOTE_ADDR", "unknown")
+        )
+
+        return client_ip
 
     def _build_handler(
         self,
diff --git a/state_machines/enb_acs_pointer.py b/state_machines/enb_acs_pointer.py
index 3ec19a7..ea0f5bf 100644
--- a/state_machines/enb_acs_pointer.py
+++ b/state_machines/enb_acs_pointer.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from state_machines.enb_acs import EnodebAcsStateMachine
 
diff --git a/state_machines/enb_acs_states.py b/state_machines/enb_acs_states.py
index d9e2ed9..bfd0824 100644
--- a/state_machines/enb_acs_states.py
+++ b/state_machines/enb_acs_states.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import time
 from abc import ABC, abstractmethod
@@ -1288,7 +1280,7 @@
         request = models.Download()
         request.CommandKey = "20220206215200"
         request.FileType = "1 Firmware Upgrade Image"
-        request.URL = "http://18.116.99.179/firmware/Qproject_TEST3918_2102241222.ffw"
+        request.URL = "http://10.128.250.131/firmware/Qproject_TEST3918_2102241222.ffw"
         request.Username = ""
         request.Password = ""
         request.FileSize = 57208579
diff --git a/state_machines/timer.py b/state_machines/timer.py
index 09f6b68..03f0e05 100644
--- a/state_machines/timer.py
+++ b/state_machines/timer.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from datetime import datetime, timedelta
 
diff --git a/stats_manager.py b/stats_manager.py
index 3d865c1..6b4b621 100644
--- a/stats_manager.py
+++ b/stats_manager.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import asyncio
 from xml.etree import ElementTree
diff --git a/tests/baicells_old_tests.py b/tests/baicells_old_tests.py
index e693790..bfed746 100644
--- a/tests/baicells_old_tests.py
+++ b/tests/baicells_old_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 # pylint: disable=protected-access
 from devices.device_utils import EnodebDeviceName
diff --git a/tests/baicells_qafb_tests.py b/tests/baicells_qafb_tests.py
index 0b0168e..dce9ba2 100644
--- a/tests/baicells_qafb_tests.py
+++ b/tests/baicells_qafb_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 # pylint: disable=protected-access
 from devices.device_utils import EnodebDeviceName
diff --git a/tests/baicells_tests.py b/tests/baicells_tests.py
index d992e58..999c1c8 100644
--- a/tests/baicells_tests.py
+++ b/tests/baicells_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 # pylint: disable=protected-access
 from data_models.data_model_parameters import ParameterName
diff --git a/tests/cavium_tests.py b/tests/cavium_tests.py
index 7cc9b9a..ba5d32b 100644
--- a/tests/cavium_tests.py
+++ b/tests/cavium_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from data_models.data_model_parameters import ParameterName
 # pylint: disable=protected-access
diff --git a/tests/configuration_init_tests.py b/tests/configuration_init_tests.py
index 5db4ffa..84e88df 100644
--- a/tests/configuration_init_tests.py
+++ b/tests/configuration_init_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 # pylint: disable=protected-access
 from unittest import TestCase
diff --git a/tests/data_model_tests.py b/tests/data_model_tests.py
index e813354..31f9c9e 100644
--- a/tests/data_model_tests.py
+++ b/tests/data_model_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 # pylint: disable=protected-access
 
diff --git a/tests/device_utils_tests.py b/tests/device_utils_tests.py
index c1d82d2..4fe43fb 100644
--- a/tests/device_utils_tests.py
+++ b/tests/device_utils_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 # pylint: disable=protected-access
 
diff --git a/tests/enb_acs_manager_tests.py b/tests/enb_acs_manager_tests.py
index c7147e0..9082dac 100644
--- a/tests/enb_acs_manager_tests.py
+++ b/tests/enb_acs_manager_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 # pylint: disable=protected-access
 from unittest import TestCase
diff --git a/tests/enodeb_acs_states_tests.py b/tests/enodeb_acs_states_tests.py
index 561007d..fecd885 100644
--- a/tests/enodeb_acs_states_tests.py
+++ b/tests/enodeb_acs_states_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from typing import Dict
 from unittest import TestCase
diff --git a/tests/enodeb_configuration_tests.py b/tests/enodeb_configuration_tests.py
index 10742ef..6546876 100644
--- a/tests/enodeb_configuration_tests.py
+++ b/tests/enodeb_configuration_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 # pylint: disable=protected-access
 
diff --git a/tests/enodeb_status_tests.py b/tests/enodeb_status_tests.py
index 3138fcf..7de7931 100644
--- a/tests/enodeb_status_tests.py
+++ b/tests/enodeb_status_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 # pylint: disable=protected-access
 from unittest import TestCase
diff --git a/tests/freedomfi_one_tests.py b/tests/freedomfi_one_tests.py
index 4d88496..b167e9b 100644
--- a/tests/freedomfi_one_tests.py
+++ b/tests/freedomfi_one_tests.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 import logging
 import os
 from unittest.mock import Mock, call, patch
diff --git a/tests/pm_file_example.xml b/tests/pm_file_example.xml
index 920d951..58eeee7 100644
--- a/tests/pm_file_example.xml
+++ b/tests/pm_file_example.xml
@@ -1,4 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+SPDX-FileCopyrightText: 2020 The Magma Authors.
+SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+
+SPDX-License-Identifier: BSD-3-Clause
+-->
+
 <PmFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PmFileFormat.xsd">
  <FileHeader>
   <InfoModelReferenced>NanoCell-eNB-PM-V2.5.0</InfoModelReferenced>
diff --git a/tests/stats_manager_tests.py b/tests/stats_manager_tests.py
index 87d0177..f1bc5ab 100644
--- a/tests/stats_manager_tests.py
+++ b/tests/stats_manager_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from unittest import TestCase, mock
 from xml.etree import ElementTree
diff --git a/tests/test_utils/config_builder.py b/tests/test_utils/config_builder.py
index f662b9f..d284880 100644
--- a/tests/test_utils/config_builder.py
+++ b/tests/test_utils/config_builder.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from lte.protos.mconfig import mconfigs_pb2
 from devices.device_utils import EnodebDeviceName
diff --git a/tests/test_utils/enb_acs_builder.py b/tests/test_utils/enb_acs_builder.py
index 75f55be..7497528 100644
--- a/tests/test_utils/enb_acs_builder.py
+++ b/tests/test_utils/enb_acs_builder.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import asyncio
 from typing import Dict
diff --git a/tests/test_utils/enodeb_handler.py b/tests/test_utils/enodeb_handler.py
index ef2b11f..8b2f2fa 100644
--- a/tests/test_utils/enodeb_handler.py
+++ b/tests/test_utils/enodeb_handler.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from unittest import TestCase, mock
 
diff --git a/tests/test_utils/mock_functions.py b/tests/test_utils/mock_functions.py
index 59fb0c7..ec8f20c 100644
--- a/tests/test_utils/mock_functions.py
+++ b/tests/test_utils/mock_functions.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from typing import Any
 
diff --git a/tests/test_utils/spyne_builder.py b/tests/test_utils/spyne_builder.py
index 0717aad..7f8dc75 100644
--- a/tests/test_utils/spyne_builder.py
+++ b/tests/test_utils/spyne_builder.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from unittest import mock
 
diff --git a/tests/test_utils/tr069_msg_builder.py b/tests/test_utils/tr069_msg_builder.py
index 3dc0f64..239d60b 100644
--- a/tests/test_utils/tr069_msg_builder.py
+++ b/tests/test_utils/tr069_msg_builder.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from typing import Any, List, Optional
 
diff --git a/tests/timer_tests.py b/tests/timer_tests.py
index ad00232..d29f88b 100644
--- a/tests/timer_tests.py
+++ b/tests/timer_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 # pylint: disable=protected-access
 from unittest import TestCase
diff --git a/tests/tr069_tests.py b/tests/tr069_tests.py
index 649fcb6..4c895b9 100644
--- a/tests/tr069_tests.py
+++ b/tests/tr069_tests.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 from datetime import datetime, timedelta, timezone
 from unittest import TestCase, mock
 from unittest.mock import Mock, patch
diff --git a/tests/transform_for_enb_tests.py b/tests/transform_for_enb_tests.py
index bcc19fa..62ab43d 100644
--- a/tests/transform_for_enb_tests.py
+++ b/tests/transform_for_enb_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 # pylint: disable=protected-access
 from unittest import TestCase
diff --git a/tests/transform_for_magma_tests.py b/tests/transform_for_magma_tests.py
index 4b76838..647059e 100644
--- a/tests/transform_for_magma_tests.py
+++ b/tests/transform_for_magma_tests.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 # pylint: disable=protected-access
 from unittest import TestCase
diff --git a/tools/gen_prometheus_proto.py b/tools/gen_prometheus_proto.py
index f0a0ec9..b292076 100644
--- a/tools/gen_prometheus_proto.py
+++ b/tools/gen_prometheus_proto.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 import os
 import sys
 
diff --git a/tools/gen_protos.py b/tools/gen_protos.py
index 3468f9e..2214f59 100644
--- a/tools/gen_protos.py
+++ b/tools/gen_protos.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 import os
 import shutil
 import sys
diff --git a/tr069/__init__.py b/tr069/__init__.py
index 5c6cb64..f07652e 100644
--- a/tr069/__init__.py
+++ b/tr069/__init__.py
@@ -1,12 +1,4 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
\ No newline at end of file
diff --git a/tr069/models.py b/tr069/models.py
index 1f850c0..221c49f 100644
--- a/tr069/models.py
+++ b/tr069/models.py
@@ -1,16 +1,7 @@
-"""
-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.
-"""
-
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from spyne.model import ComplexModel
 from spyne.model.complex import XmlAttribute, XmlData
diff --git a/tr069/rpc_methods.py b/tr069/rpc_methods.py
index c6203d9..46315a8 100644
--- a/tr069/rpc_methods.py
+++ b/tr069/rpc_methods.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 from logger import EnodebdLogger as logger
 from state_machines.enb_acs_manager import StateMachineManager
diff --git a/tr069/server.py b/tr069/server.py
index ecda15b..976019a 100644
--- a/tr069/server.py
+++ b/tr069/server.py
@@ -1,15 +1,7 @@
-"""
-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.
-"""
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
 import _thread
 import socket
diff --git a/tr069/spyne_mods.py b/tr069/spyne_mods.py
index ad0b54b..7f191ff 100644
--- a/tr069/spyne_mods.py
+++ b/tr069/spyne_mods.py
@@ -1,15 +1,9 @@
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
 """
-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.
-
 This file contains modifications of the core spyne functionality. This is done
 using child classes and function override to avoid modifying spyne code itself.
 Each function below is a modified version of the parent function. These
diff --git a/tr069/tests/models_tests.py b/tr069/tests/models_tests.py
index faa76ff..9abe764 100644
--- a/tr069/tests/models_tests.py
+++ b/tr069/tests/models_tests.py
@@ -1,15 +1,8 @@
-"""
-Copyright 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
 
-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.
-"""
 import unittest
 
 from tr069.models import DeviceIdStruct