diff --git a/sdnr/northbound/pom.xml b/sdnr/northbound/pom.xml
index 311e4da..52ccbf7 100644
--- a/sdnr/northbound/pom.xml
+++ b/sdnr/northbound/pom.xml
@@ -45,6 +45,7 @@
         <module>oofpcipoc</module>
         <module>a1Adapter</module>
         <module>CMNotify</module>
+        <module>ranSlice</module>
         <module>features</module>
     </modules>
 </project>
diff --git a/sdnr/northbound/ranSlice/feature/pom.xml b/sdnr/northbound/ranSlice/feature/pom.xml
new file mode 100644
index 0000000..fef1ece
--- /dev/null
+++ b/sdnr/northbound/ranSlice/feature/pom.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ ============LICENSE_START=======================================================
+  ~ ONAP : ccsdk features
+  ~ ================================================================================
+  ~ Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+  ~ ================================================================================
+  ~ 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.
+  ~ ============LICENSE_END=======================================================
+  ~
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>single-feature-parent</artifactId>
+        <version>2.0.1-SNAPSHOT</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.onap.ccsdk.features.sdnr.northbound</groupId>
+    <artifactId>ranSlice-feature</artifactId>
+    <version>1.0.1-SNAPSHOT</version>
+    <packaging>feature</packaging>
+
+    <name>ccsdk-features :: sdnr-northbound :: ${project.artifactId}</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>ranSlice-provider</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/sdnr/northbound/ranSlice/installer/pom.xml b/sdnr/northbound/ranSlice/installer/pom.xml
new file mode 100644
index 0000000..c454d70
--- /dev/null
+++ b/sdnr/northbound/ranSlice/installer/pom.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ ============LICENSE_START=======================================================
+  ~ ONAP : ccsdk features
+  ~ ================================================================================
+  ~ Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+  ~ ================================================================================
+  ~ 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.
+  ~ ============LICENSE_END=======================================================
+  ~
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>odlparent-lite</artifactId>
+        <version>2.0.1-SNAPSHOT</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.onap.ccsdk.features.sdnr.northbound</groupId>
+    <artifactId>ranSlice-installer</artifactId>
+    <version>1.0.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <name>ccsdk-features :: sdnr-northbound :: ${project.artifactId}</name>
+
+    <properties>
+        <application.name>ranSlice</application.name>
+        <include.transitive.dependencies>false</include.transitive.dependencies>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.onap.ccsdk.features.sdnr.northbound</groupId>
+            <artifactId>${application.name}-feature</artifactId>
+            <version>${project.version}</version>
+            <type>xml</type>
+            <classifier>features</classifier>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>ranSlice-provider</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>maven-repo-zip</id>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <phase>package</phase>
+                        <configuration>
+                            <attach>true</attach>
+                            <finalName>stage/${application.name}-${project.version}</finalName>
+                            <descriptors>
+                                <descriptor>src/assembly/assemble_mvnrepo_zip.xml</descriptor>
+                            </descriptors>
+                            <appendAssemblyId>true</appendAssemblyId>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-dependencies</id>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <phase>prepare-package</phase>
+                        <configuration>
+                            <transitive>false</transitive>
+                            <outputDirectory>${project.build.directory}/assembly/system</outputDirectory>
+                            <overWriteReleases>false</overWriteReleases>
+                            <overWriteSnapshots>true</overWriteSnapshots>
+                            <overWriteIfNewer>true</overWriteIfNewer>
+                            <useRepositoryLayout>true</useRepositoryLayout>
+                            <addParentPoms>false</addParentPoms>
+                            <copyPom>false</copyPom>
+                            <includeArtifactIds>ranSlice-model,ranSlice-provider,ranSlice-feature</includeArtifactIds>
+                            <scope>provided</scope>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/sdnr/northbound/ranSlice/installer/src/assembly/assemble_mvnrepo_zip.xml b/sdnr/northbound/ranSlice/installer/src/assembly/assemble_mvnrepo_zip.xml
new file mode 100644
index 0000000..dfe5060
--- /dev/null
+++ b/sdnr/northbound/ranSlice/installer/src/assembly/assemble_mvnrepo_zip.xml
@@ -0,0 +1,47 @@
+<!--
+  ~ ============LICENSE_START=======================================================
+  ~ ONAP : ccsdk features
+  ~ ================================================================================
+  ~ Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved.
+  ~ ================================================================================
+  ~ 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.
+  ~ ============LICENSE_END=======================================================
+  ~
+  -->
+
+<!-- Defines how we build the .zip file which is our distribution. -->
+
+<assembly
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+    <id>repo</id>
+    <formats>
+        <format>zip</format>
+    </formats>
+
+    <!--  we want "system" and related files right at the root level
+          as this file is suppose to be unzip on top of a karaf
+          distro. -->
+    <includeBaseDirectory>false</includeBaseDirectory>
+
+    <fileSets>
+        <fileSet>
+            <directory>target/assembly/</directory>
+            <outputDirectory>.</outputDirectory>
+            <excludes>
+            </excludes>
+        </fileSet>
+    </fileSets>
+
+</assembly>
diff --git a/sdnr/northbound/ranSlice/model/pom.xml b/sdnr/northbound/ranSlice/model/pom.xml
new file mode 100644
index 0000000..84d3b50
--- /dev/null
+++ b/sdnr/northbound/ranSlice/model/pom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ ============LICENSE_START=======================================================
+  ~ ONAP : ccsdk features
+  ~ ================================================================================
+  ~ Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+  ~ ================================================================================
+  ~ 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.
+  ~ ============LICENSE_END=======================================================
+  ~
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>binding-parent</artifactId>
+        <version>2.0.1-SNAPSHOT</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.onap.ccsdk.features.sdnr.northbound</groupId>
+    <artifactId>ranSlice-model</artifactId>
+    <version>1.0.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+
+    <name>ccsdk-features :: sdnr-northbound :: ${project.artifactId}</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+            <artifactId>rfc6991</artifactId>
+        </dependency>
+    </dependencies>
+
+
+</project>
diff --git a/sdnr/northbound/ranSlice/model/src/main/yang/ran-network@2020-08-06.yang b/sdnr/northbound/ranSlice/model/src/main/yang/ran-network@2020-08-06.yang
new file mode 100644
index 0000000..f45bd7c
--- /dev/null
+++ b/sdnr/northbound/ranSlice/model/src/main/yang/ran-network@2020-08-06.yang
@@ -0,0 +1,1880 @@
+module ran-network {
+  yang-version 1.1;
+  namespace "org:onap:ccsdk:features:sdnr:northbound:ran-network";
+  prefix rn;
+
+  import ietf-inet-types {
+    prefix inet;
+  }
+  import ietf-yang-types {
+    prefix yang;
+  }
+
+  organization
+    "Open Network Automation Platform - ONAP
+     <https://www.onap.org>";
+  contact
+    "Editors:
+       Sandeep Shah
+       <mailto:sandeep.shah@ibm.com>
+
+       Swaminathan Seetharaman
+       <mailto:swaminathan.seetharaman@wipro.com>";
+  description
+    "This module contains a collection of YANG definitions for managing
+     radio access network (RAN) managed network functions.
+     This YANG model is used solely for POC's in the ONAP and O-RAN communities
+
+     Copyright 2020 the O-RAN Alliance.
+
+     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.";
+
+  revision 2020-08-06 {
+    description
+      "RAN Network YANG Model for ONAP/O-RAN POC";
+    reference
+      "https://wiki.onap.org/display/DW/E2E+Network+Slicing+Use+Case+in+R7+Guilin";
+  }
+
+  typedef usageState {
+    type enumeration {
+      enum IDLE {
+        description
+          "TODO";
+      }
+      enum ACTIVE {
+        description
+          "TODO";
+      }
+      enum BUSY {
+        description
+          "TODO";
+      }
+    }
+    description
+      "It describes whether or not the resource is actively in
+       use at a specific instant, and if so, whether or not it has spare
+       capacity for additional users at that instant. The value is READ-ONLY.";
+    reference
+      "ITU T Recommendation X.731";
+  }
+
+  typedef Mcc {
+    type string;
+    description
+      "The mobile country code consists of three decimal digits,
+       The first digit of the mobile country code identifies the geographic
+       region (the digits 1 and 8 are not used):";
+    reference
+      "3GPP TS 23.003 subclause 2.2 and 12.1";
+  }
+
+  typedef Mnc {
+    type string;
+    description
+      "The mobile network code consists of two or three
+       decimal digits (for example: MNC of 001 is not the same as MNC of 01)";
+    reference
+      "3GPP TS 23.003 subclause 2.2 and 12.1";
+  }
+
+  typedef Nci {
+    type string;
+    description
+      "NR Cell Identity. The NCI shall be of fixed length of 36 bits
+       and shall be coded using full hexadecimal representation.
+       The exact coding of the NCI is the responsibility of each PLMN operator";
+    reference
+      "TS 23.003";
+  }
+
+  typedef OperationalState {
+    type enumeration {
+      enum DISABLED {
+        value 0;
+        description
+          "The resource is totally inoperable.";
+      }
+      enum ENABLED {
+        value 1;
+        description
+          "The resource is partially or fully operable.";
+      }
+    }
+    description
+      "TODO";
+    reference
+      "3GPP TS 28.625 and ITU-T X.731";
+  }
+
+  typedef AdministrativeState {
+    type enumeration {
+      enum LOCKED {
+        value 0;
+        description
+          "The resource is administratively prohibited from performing
+           services for its users.";
+      }
+      enum UNLOCKED {
+        value 1;
+        description
+          "The resource is administratively permitted to perform
+           services for its users. This is independent of its inherent
+           operability.";
+      }
+      enum SHUTTINGDOWN {
+        value 2;
+        description
+          "Use of the resource is administratively permitted to
+           existing instances of use only. While the system remains in
+           the shutting down state the manager or the managed element
+           may at any time cause the resource to transition to the
+           locked state.";
+      }
+    }
+    description
+      "TODO";
+    reference
+      "3GPP TS 28.625 and ITU-T X.731";
+  }
+
+  typedef AvailabilityStatus {
+    type enumeration {
+      enum IN_TEST {
+        description
+          "TODO";
+      }
+      enum FAILED {
+        description
+          "TODO";
+      }
+      enum POWER_OFF {
+        description
+          "TODO";
+      }
+      enum OFF_LINE {
+        description
+          "TODO";
+      }
+      enum OFF_DUTY {
+        description
+          "TODO";
+      }
+      enum DEPENDENCY {
+        description
+          "TODO";
+      }
+      enum DEGRADED {
+        description
+          "TODO";
+      }
+      enum NOT_INSTALLED {
+        description
+          "TODO";
+      }
+      enum LOG_FULL {
+        description
+          "TODO";
+      }
+    }
+    description
+      "TODO";
+    reference
+      "TODO";
+  }
+
+  typedef CellState {
+    type enumeration {
+      enum IDLE {
+        description
+          "TODO";
+      }
+      enum INACTIVE {
+        description
+          "TODO";
+      }
+      enum ACTIVE {
+        description
+          "TODO";
+      }
+    }
+    description
+      "TODO";
+    reference
+      "TODO";
+  }
+
+  typedef SNssai {
+    type uint32;
+    description
+      "Single Network Slice Selection Assistance Information.";
+    reference
+      "TS 23.501 clause 5.15.2";
+  }
+
+  typedef Sst {
+    type uint8;
+    description
+      "TODO";
+    reference
+      "TODO";
+  }
+
+  typedef Nrpci {
+    type uint32;
+    description
+      "Physical Cell Identity (PCI) of the NR cell.";
+    reference
+      "TS 36.211 subclause 6.11";
+  }
+
+  typedef Tac {
+    type int32 {
+      range "0..16777215";
+    }
+    description
+      "Tracking Area Code";
+    reference
+      "TS 23.003 clause 19.4.2.3";
+  }
+
+  typedef AmfRegionId {
+    type string;
+    description
+      "";
+    reference
+      "clause 2.10.1 of 3GPP TS 23.003";
+  }
+
+  typedef AmfSetId {
+    type string;
+    description
+      "";
+    reference
+      "clause 2.10.1 of 3GPP TS 23.003";
+  }
+
+  typedef AmfPointer {
+    type string;
+    description
+      "";
+    reference
+      "clause 2.10.1 of 3GPP TS 23.003";
+  }
+
+  // type definitions especially for core NFs
+
+  typedef NfType {
+    type enumeration {
+      enum NRF {
+        description
+          "TODO";
+      }
+      enum UDM {
+        description
+          "TODO";
+      }
+      enum AMF {
+        description
+          "TODO";
+      }
+      enum SMF {
+        description
+          "TODO";
+      }
+      enum AUSF {
+        description
+          "TODO";
+      }
+      enum NEF {
+        description
+          "TODO";
+      }
+      enum PCF {
+        description
+          "TODO";
+      }
+      enum SMSF {
+        description
+          "TODO";
+      }
+      enum NSSF {
+        description
+          "TODO";
+      }
+      enum UDR {
+        description
+          "TODO";
+      }
+      enum LMF {
+        description
+          "TODO";
+      }
+      enum GMLC {
+        description
+          "TODO";
+      }
+      enum 5G_EIR {
+        description
+          "TODO";
+      }
+      enum SEPP {
+        description
+          "TODO";
+      }
+      enum UPF {
+        description
+          "TODO";
+      }
+      enum N3IWF {
+        description
+          "TODO";
+      }
+      enum AF {
+        description
+          "TODO";
+      }
+      enum UDSF {
+        description
+          "TODO";
+      }
+      enum BSF {
+        description
+          "TODO";
+      }
+      enum CHF {
+        description
+          "TODO";
+      }
+    }
+    description
+      "TODO";
+  }
+
+  typedef NotificationType {
+    type enumeration {
+      enum N1_MESSAGES {
+        description
+          "TODO";
+      }
+      enum N2_INFORMATION {
+        description
+          "TODO";
+      }
+      enum LOCATION_NOTIFICATION {
+        description
+          "TODO";
+      }
+    }
+    description
+      "TODO";
+  }
+
+  typedef Load {
+    type uint8 {
+      range "0..100";
+    }
+    description
+      "Latest known load information of the NF, percentage ";
+  }
+
+  typedef N1MessageClass {
+    type enumeration {
+      enum 5GMM {
+        description
+          "TODO";
+      }
+      enum SM {
+        description
+          "TODO";
+      }
+      enum LPP {
+        description
+          "TODO";
+      }
+      enum SMS {
+        description
+          "TODO";
+      }
+    }
+    description
+      "TODO";
+  }
+
+  typedef N2InformationClass {
+    type enumeration {
+      enum SM {
+        description
+          "TODO";
+      }
+      enum NRPPA {
+        description
+          "TODO";
+      }
+      enum PWS {
+        description
+          "TODO";
+      }
+      enum PWS_BCAL {
+        description
+          "TODO";
+      }
+      enum PWS_RF {
+        description
+          "TODO";
+      }
+    }
+    description
+      "TODO";
+    reference
+      "TODO";
+  }
+
+  typedef NsiId {
+    type string;
+    description
+      "TODO";
+  }
+
+  typedef UeMobilityLevel {
+    type enumeration {
+      enum STATIONARY {
+        description
+          "TODO";
+      }
+      enum NOMADIC {
+        description
+          "TODO";
+      }
+      enum RESTRICTED_MOBILITY {
+        description
+          "TODO";
+      }
+      enum FULLY_MOBILITY {
+        description
+          "TODO";
+      }
+    }
+    description
+      "TODO";
+    reference
+      "TODO";
+  }
+
+  typedef ResourceSharingLevel {
+    type enumeration {
+      enum SHARED {
+        description
+          "TODO";
+      }
+      enum NOT_SHARED {
+        description
+          "TODO";
+      }
+    }
+    description
+      "TODO";
+    reference
+      "TODO";
+  }
+
+  typedef TxDirection {
+    type enumeration {
+      enum DL {
+        description
+          "TODO";
+      }
+      enum UL {
+        description
+          "TODO";
+      }
+      enum DL_AND_UL {
+        description
+          "TODO";
+      }
+    }
+    description
+      "TODO";
+    reference
+      "TODO";
+  }
+
+  typedef DistinguishedName { // TODO is this equivalent to TS 32.300 ?
+    type string;
+    description
+      "Represents the international standard for the representation
+       of Distinguished Name (RFC 4512).
+       The format of the DistinguishedName REGEX is:
+       {AttributeType = AttributeValue}
+
+       AttributeType consists of alphanumeric and hyphen (OIDs not allowed).
+       All other characters are restricted.
+       The Attribute value cannot contain control characters or the
+       following characters : \\ > < ; \" + , (Comma) and White space
+       The Attribute value can contain the following characters if they
+       are excaped : \\ > < ; \" + , (Comma) and White space
+       The Attribute value can contain control characters if its an escaped
+       double digit hex number.
+       Examples could be
+       UID=nobody@example.com,DC=example,DC=com
+       CN=John Smith,OU=Sales,O=ACME Limited,L=Moab,ST=Utah,C=US";
+    reference
+      "RFC 4512 Lightweight Directory Access Protocol (LDAP):
+             Directory Information Models";
+  } // recheck regexp it doesn't handle posix [:cntrl:]
+
+  typedef QOffsetRange {
+    type int8;
+    units "dB";
+    description
+      "TODO";
+    reference
+      "TODO";
+  }
+
+  typedef QuotaType {
+    type enumeration {
+      enum STRICT {
+        description
+          "TODO";
+      }
+      enum FLOAT {
+        description
+          "TODO";
+      }
+    }
+    description
+      "TODO";
+  }
+
+  typedef CyclicPrefix {
+    type enumeration {
+      enum NORMAL {
+        description
+          "TODO";
+      }
+      enum EXTENDED {
+        description
+          "TODO";
+      }
+    }
+    description
+      "TODO";
+  }
+
+  grouping PLMNInfo {
+    description
+      "The PLMNInfo data type define a S-NSSAI member in a specific PLMNId, and it have
+       two attributes PLMNId and S-NSSAI (PLMNId, S-NSSAI). The PLMNId represents a data type that
+       is comprised of mcc (mobile country code) and mnc (mobile network code), (See TS 23.003
+       subclause 2.2 and 12.1) and S-NSSAI represents an data type, that is comprised of an SST
+       (Slice/Service type) and an optional SD (Slice Differentiator) field, (See TS 23.003 [13]).";
+    uses PLMNId;
+    leaf sNssai {
+      type SNssai;
+      description
+        "TODO";
+    }
+  }
+
+  grouping ManagedNFProfile {
+    description
+      "Defines profile for managed NF";
+    reference
+      "3GPP TS 23.501";
+    leaf idx {
+      type uint32;
+      description
+        "TODO";
+      reference
+        "3GPP TS 23.501";
+    }
+    leaf nfInstanceID {
+      type yang:uuid;
+      config false;
+      mandatory true;
+      description
+        "This parameter defines profile for managed NF.
+         The format of the NF Instance ID shall be a
+         Universally Unique Identifier (UUID) version 4,
+         as described in IETF RFC 4122 ";
+    }
+    leaf-list nfType {
+      type NfType;
+      config false;
+      min-elements 1;
+      description
+        "Type of the Network Function";
+    }
+    leaf hostAddr {
+      type inet:host;
+      mandatory true;
+      description
+        "Host address of a NF";
+    }
+    leaf authzInfo {
+      type string;
+      description
+        "This parameter defines NF Specific Service authorization
+         information. It shall include the NF type (s) and NF realms/origins
+         allowed to consume NF Service(s) of NF Service Producer.";
+      reference
+        "See TS 23.501";
+    }
+    leaf location {
+      type string;
+      description
+        "Information about the location of the NF instance
+         (e.g. geographic location, data center) defined by operator";
+      reference
+        "TS 29.510";
+    }
+    leaf capacity {
+      type uint16;
+      mandatory true;
+      description
+        "This parameter defines static capacity information
+         in the range of 0-65535, expressed as a weight relative to other
+         NF instances of the same type; if capacity is also present in the
+         nfServiceList parameters, those will have precedence over this value.";
+      reference
+        "TS 29.510";
+    }
+    leaf nFSrvGroupId {
+      type string;
+      description
+        "This parameter defines identity of the group that is
+         served by the NF instance.
+         May be config false or true depending on the ManagedFunction.
+         Config=true for Udrinfo. Config=false for UdmInfo and AusfInfo.
+         Shall be present if ../nfType = UDM or AUSF or UDR. ";
+      reference
+        "TS 29.510";
+    }
+    leaf-list supportedDataSetIds {
+      type enumeration {
+        enum SUBSCRIPTION {
+          description
+            "TODO";
+        }
+        enum POLICY {
+          description
+            "TODO";
+        }
+        enum EXPOSURE {
+          description
+            "TODO";
+        }
+        enum APPLICATION {
+          description
+            "TODO";
+        }
+      }
+      description
+        "List of supported data sets in the UDR instance.
+         May be present if ../nfType = UDR";
+      reference
+        "TS 29.510";
+    }
+    leaf-list smfServingAreas {
+      type string;
+      description
+        "Defines the SMF service area(s) the UPF can serve.
+         Shall be present if ../nfType = UPF";
+      reference
+        "TS 29.510";
+    }
+    leaf priority {
+      type uint16;
+      description
+        "This parameter defines Priority (relative to other NFs
+         of the same type) in the range of 0-65535, to be used for NF selection;
+         lower values indicate a higher priority. If priority is also present
+         in the nfServiceList parameters, those will have precedence over
+         this value. Shall be present if ../nfType = AMF ";
+      reference
+        "TS 29.510";
+    }
+  }
+
+  grouping SAP {
+    description
+      "Service access point.";
+    reference
+      "TS 28.622";
+    leaf host {
+      type inet:host;
+      mandatory true;
+      description
+        "TODO";
+    }
+    leaf port {
+      type inet:port-number;
+      mandatory true;
+      description
+        "TODO";
+    }
+  }
+
+  grouping PLMNId {
+    description
+      "TODO";
+    reference
+      "TS 23.658";
+    leaf mcc {
+      type Mcc;
+      mandatory true;
+      description
+        "TODO";
+    }
+    leaf mnc {
+      type Mnc;
+      mandatory true;
+      description
+        "TODO";
+    }
+  }
+
+  grouping AmfIdentifier {
+    description
+      "The AMFI is constructed from an AMF Region ID,
+       an AMF Set ID and an AMF Pointer.
+       The AMF Region ID identifies the region,
+       the AMF Set ID uniquely identifies the AMF Set within the AMF Region, and
+       the AMF Pointer uniquely identifies the AMF within the AMF Set. ";
+    leaf amfRegionId {
+      type AmfRegionId;
+      description
+        "TODO";
+    }
+    leaf amfSetId {
+      type AmfSetId;
+      description
+        "TODO";
+    }
+    leaf amfPointer {
+      type AmfPointer;
+      description
+        "TODO";
+    }
+  }
+
+  grouping DefaultNotificationSubscription {
+    description
+      "TODO";
+    leaf notificationType {
+      type NotificationType;
+      description
+        "TODO";
+    }
+    leaf callbackUri {
+      type inet:uri;
+      description
+        "TODO";
+    }
+    leaf n1MessageClass {
+      type N1MessageClass;
+      description
+        "TODO";
+    }
+    leaf n2InformationClass {
+      type N2InformationClass;
+      description
+        "TODO";
+    }
+  }
+
+  grouping Ipv4AddressRange {
+    description
+      "TODO";
+    leaf start {
+      type inet:ipv4-address;
+      description
+        "TODO";
+    }
+    leaf end {
+      type inet:ipv4-address;
+      description
+        "TODO";
+    }
+  }
+
+  grouping Ipv6PrefixRange {
+    description
+      "TODO";
+    leaf start {
+      type inet:ipv6-prefix;
+      description
+        "TODO";
+    }
+    leaf end {
+      type inet:ipv6-prefix;
+      description
+        "TODO";
+    }
+  }
+
+  grouping AddressWithVlan {
+    description
+      "TODO";
+    leaf ipAddress {
+      type inet:ip-address;
+      description
+        "TODO";
+    }
+    leaf vlanId {
+      type uint16;
+      description
+        "TODO";
+    }
+  }
+
+  grouping ManagedElementGroup {
+    description
+      "Abstract class representing telecommunications resources.";
+    leaf dnPrefix {
+      type DistinguishedName;
+      description
+        "Provides naming context and splits the DN into a DN Prefix and Local DN";
+    }
+    leaf userLabel {
+      type string;
+      description
+        "A user-friendly name of this object.";
+    }
+    leaf locationName {
+      type string;
+      config false;
+      description
+        "The physical location (e.g. an address) of an entity";
+    }
+    leaf-list managedBy {
+      type DistinguishedName;
+      config false;
+      description
+        "Relates to the role played by ManagementSystem";
+    }
+    leaf-list managedElementTypeList {
+      type string;
+      config false;
+      min-elements 1;
+      description
+        "The type of functionality provided by the ManagedElement.
+         It may represent one ME functionality or a combination of
+         Two examples of allowed values are:
+         -  NodeB;
+         -  HLR, VLR.";
+    }
+  } // Managed Element grouping
+
+  grouping NearRTRICGroup {
+    description
+      "Abstract class representing Near RT RIC.";
+    leaf near-rt-ric-url {
+      type inet:uri;
+      description
+        "URL for the near RT RIC. String representing IP addr:port";
+    }
+    leaf dnPrefix {
+      type DistinguishedName;
+      description
+        "Provides naming context and splits the DN into a DN Prefix and Local DN";
+    }
+    leaf userLabel {
+      type string;
+      description
+        "A user-friendly name of this object.";
+    }
+    leaf locationName {
+      type string;
+      config false;
+      description
+        "The physical location (e.g. an address) of an entity";
+    }
+    leaf-list managedBy {
+      type DistinguishedName;
+      config false;
+      description
+        "Relates to the role played by ManagementSystem";
+    }
+  } // Near RT RIC grouping
+
+  grouping GNBDUFunctionGroup {
+    description
+      "Represents the GNBDUFunction IOC.";
+    reference
+      "3GPP TS 28.541";
+    leaf gNBId {
+      type int64 {
+        range "0..4294967295";
+      }
+      config false;
+      mandatory true;
+      description
+        "Identifies a gNB within a PLMN. The gNB Identifier (gNB ID)
+         is part of the NR Cell Identifier (NCI) of the gNB cells.";
+      reference
+        "gNB ID in 3GPP TS 38.300, Global gNB ID in 3GPP TS 38.413";
+    }
+    leaf gNBIdLength {
+      type int32 {
+        range "22..32";
+      }
+      mandatory true;
+      description
+        "Indicates the number of bits for encoding the gNB ID.";
+      reference
+        "gNB ID in 3GPP TS 38.300, Global gNB ID in 3GPP TS 38.413";
+    }
+    leaf gNBDUId {
+      type int64 {
+        range "0..68719476735";
+      }
+      mandatory true;
+      description
+        "Uniquely identifies the DU at least within a gNB.";
+      reference
+        "3GPP TS 38.473";
+    }
+    leaf gNBDUName {
+      type string {
+        length "1..150";
+      }
+      description
+        "Identifies the Distributed Unit of an NR node";
+      reference
+        "3GPP TS 38.473";
+    }
+    leaf aggressorSetID {
+      type uint32 {
+        range "0..4194304";
+      }
+      config false;
+      description
+        "Indicates the associated aggressor gNB Set ID of the cell
+         Valid when Remote Interference Management function is supported.";
+      reference
+        "3GPP TS 38.211 subclause 7.4.1.6";
+    }
+    leaf victimSetID {
+      type uint32 {
+        range "0..4194304";
+      }
+      config false;
+      description
+        "Indicates the associated victim gNB Set ID of the cell
+         Valid when Remote Interference Management function is supported.";
+      reference
+        "3GPP TS 38.211 subclause 7.4.1.6";
+    }
+  }
+
+  grouping NRCellDUGroup {
+    description
+      "Represents the NRCellDU IOC.";
+    reference
+      "3GPP TS 28.541";
+    uses RRMPolicy_Group;
+    leaf cellLocalId {
+      type int32 {
+        range "0..16383";
+      }
+      mandatory true;
+      description
+        "Identifies an NR cell of a gNB. Together with the
+         corresponding gNB identifier in forms the NR Cell Identity (NCI).";
+      reference
+        "NCI in 3GPP TS 38.300";
+    }
+    leaf operationalState {
+      type OperationalState;
+      config false;
+      description
+        "Operational state of the NRCellDU instance. Indicates
+         whether the resource is installed and partially or fully operable
+         (ENABLED) or the resource is not installed or not operable
+         (DISABLED).";
+    }
+    leaf administrativeState {
+      type AdministrativeState;
+      default "LOCKED";
+      description
+        "Administrative state of the NRCellDU. Indicates the
+         permission to use or prohibition against using the cell, imposed
+         through the OAM services.";
+    }
+    leaf cellState {
+      type CellState;
+      config false;
+      description
+        "Cell state of the NRCellDU instance. Indicates whether the
+         cell is not currently in use (IDLE), or currently in use but not
+         configured to carry traffic (INACTIVE), or currently in use and is
+         configured to carry traffic (ACTIVE).";
+    }
+    list pLMNInfoList {
+      key "mcc mnc";
+      min-elements 1;
+      description
+        "The PLMNInfoList is a list of PLMNInfo data type. It defines which PLMNs that
+         can be served by the NR cell, and which S-NSSAIs that can be supported by the NR cell for
+         corresponding PLMN in case of network slicing feature is supported. The plMNId of the first
+         entry of the list is the PLMNId used to construct the nCGI for the NR cell.";
+      uses PLMNInfo;
+    }
+    leaf nRPCI {
+      type int32 {
+        range "0..1007";
+      }
+      mandatory true;
+      description
+        "The Physical Cell Identity (PCI) of the NR cell.";
+      reference
+        "3GPP TS 36.211";
+    }
+    leaf nRTAC {
+      type Tac;
+      description
+        "The common 5GS Tracking Area Code for the PLMNs.";
+      reference
+        "3GPP TS 23.003, 3GPP TS 38.473";
+    }
+    leaf arfcnDL {
+      type int32;
+      mandatory true;
+      description
+        "NR Absolute Radio Frequency Channel Number (NR-ARFCN) for
+         downlink.";
+      reference
+        "3GPP TS 38.104";
+    }
+    leaf arfcnUL {
+      type int32;
+      description
+        "NR Absolute Radio Frequency Channel Number (NR-ARFCN) for
+         uplink.";
+      reference
+        "3GPP TS 38.104";
+    }
+    leaf arfcnSUL {
+      type int32;
+      description
+        "NR Absolute Radio Frequency Channel Number (NR-ARFCN) for
+         supplementary uplink.";
+      reference
+        "3GPP TS 38.104";
+    }
+    leaf bSChannelBwDL {
+      type int32;
+      units "MHz";
+      description
+        "Base station channel bandwidth for downlink.";
+      reference
+        "3GPP TS 38.104";
+    }
+    leaf bSChannelBwUL {
+      type int32;
+      units "MHz";
+      description
+        "Base station channel bandwidth for uplink.";
+      reference
+        "3GPP TS 38.104";
+    }
+    leaf bSChannelBwSUL {
+      type int32;
+      units "MHz";
+      description
+        "Base station channel bandwidth for supplementary uplink.";
+      reference
+        "3GPP TS 38.104";
+    }
+    leaf ssbFrequency {
+      type int32 {
+        range "0..3279165";
+      }
+      mandatory true;
+      description
+        "Indicates cell defining SSB frequency domain position.
+         Frequency (in terms of NR-ARFCN) of the cell defining SSB transmission.
+         The frequency identifies the position of resource element RE=#0
+         (subcarrier #0) of resource block RB#10 of the SS block. The frequency
+         must be positioned on the NR global frequency raster, as defined in
+         3GPP TS 38.101, and within bSChannelBwDL.";
+    }
+    leaf ssbPeriodicity {
+      type int32 {
+        range "5 | 10 | 20 | 40 | 80 | 160";
+      }
+      units "subframes (ms)";
+      mandatory true;
+      description
+        "Indicates cell defined SSB periodicity. The SSB periodicity
+         is used for the rate matching purpose.";
+    }
+    leaf ssbSubCarrierSpacing {
+      type int32 {
+        range "15 | 30 | 120 | 240";
+      }
+      units "kHz";
+      mandatory true;
+      description
+        "Subcarrier spacing of SSB. Only the values 15 kHz or 30 kHz
+         (< 6 GHz), 120 kHz or 240 kHz (> 6 GHz) are applicable.";
+      reference
+        "3GPP TS 38.211";
+    }
+    leaf ssbOffset {
+      type int32 {
+        range "0..159";
+      }
+      units "subframes (ms)";
+      mandatory true;
+      description
+        "Indicates cell defining SSB time domain position. Defined
+         as the offset of the measurement window, in which to receive SS/PBCH
+         blocks, where allowed values depend on the ssbPeriodicity
+         (ssbOffset < ssbPeriodicity).";
+    }
+    leaf ssbDuration {
+      type int32 {
+        range "1..5";
+      }
+      units "subframes (ms)";
+      mandatory true;
+      description
+        "Duration of the measurement window in which to receive
+         SS/PBCH blocks.";
+      reference
+        "3GPP TS 38.213";
+    }
+    leaf-list nRSectorCarrierRef {
+      type DistinguishedName;
+      min-elements 1;
+      description
+        "Reference to corresponding NRSectorCarrier instance.";
+    }
+    leaf-list bWPRef {
+      type DistinguishedName;
+      // min-elements 0;
+      description
+        "Reference to corresponding BWP instance.";
+    }
+    leaf-list nRFrequencyRef {
+      type DistinguishedName;
+      // min-elements 0;
+      description
+        "Reference to corresponding NRFrequency instance.";
+    }
+  } // grouping
+
+  grouping rRMPolicyMemberGroup {
+    description
+      "TODO";
+    uses PLMNId;
+    leaf sNSSAI {
+      type SNssai;
+      description
+        "This data type represents an RRM Policy member that will be part of a
+         rRMPolicyMemberList. A RRMPolicyMember is defined by its pLMNId and sNSSAI (S-NSSAI).
+         The members in a rRMPolicyMemberList are assigned a specific amount of RRM resources
+         based on settings in RRMPolicy.";
+    }
+  }
+
+  grouping RRMPolicy_Group {
+    description
+      "This IOC represents the properties of an abstract RRMPolicy. The RRMPolicy_ IOC
+       needs to be subclassed to be instantiated. It defines two attributes apart from those
+       inherited from Top IOC, the resourceType attribute defines type of resource (PRB, RRC
+       connected users, DRB usage etc.) and the rRMPolicyMemberList attribute defines the
+       RRMPolicyMember(s)that are subject to this policy. An RRM resource (defined in resourceType
+       attribute) is located in NRCellDU, NRCellCU, GNBDUFunction, GNBCUCPFunction or in
+       GNBCUUPFunction. The RRMPolicyRatio IOC is one realization of a RRMPolicy_ IOC, see the
+       inheritance in TS 28.541 Figure 4.2.1.2-1. This RRM framework allows adding new policies,
+       both standardized (like RRMPolicyRatio) or as vendor specific, by inheriting from the
+       abstract RRMPolicy_ IOC.";
+    leaf resourceType {
+      type string;
+      mandatory true;
+      description
+        "The resourceType attribute defines type of resource (PRB, RRC connected users,
+         DRB usage etc.) that is subject to policy. Valid values are 'PRB', 'RRC' or 'DRB'";
+    }
+    list rRMPolicyMemberList {
+      key "idx";
+      min-elements 1;
+      description
+        "It represents the list of RRMPolicyMember (s) that the managed object
+         is supporting. A RRMPolicyMember <<dataType>> include the PLMNId <<dataType>>
+         and S-NSSAI <<dataType>>.";
+      leaf idx {
+        type uint32;
+        description
+          "TODO";
+      }
+      uses rRMPolicyMemberGroup;
+    }
+  } // grouping
+
+  grouping GNBCUUPFunctionGroup {
+    description
+      "Represents the GNBCUUPFunction IOC.";
+    reference
+      "3GPP TS 28.541";
+    uses RRMPolicy_Group;
+    leaf gNBCUUPId {
+      type uint64 {
+        range "0..68719476735";
+      }
+      config false;
+      mandatory true;
+      description
+        "Identifies the gNB-CU-UP at least within a gNB-CU-CP";
+      reference
+        "'gNB-CU-UP ID' in subclause 9.3.1.15 of 3GPP TS 38.463";
+    }
+    leaf gNBId {
+      type int32 {
+        range "22..32";
+      }
+      mandatory true;
+      description
+        "Indicates the number of bits for encoding the gNB Id.";
+      reference
+        "gNB Id in 3GPP TS 38.300, Global gNB ID in 3GPP TS 38.413";
+    }
+    list pLMNInfoList {
+      key "mcc mnc";
+      description
+        "The PLMNInfoList is a list of PLMNInfo data type. It defines which PLMNs that
+         can be served by the GNBCUUPFunction and which S-NSSAIs can be supported by the
+         GNBCUUPFunction for corresponding PLMN in case of network slicing feature is supported";
+      uses PLMNInfo;
+    }
+  } // grouping
+
+  grouping GNBCUCPFunctionGroup {
+    description
+      "Represents the GNBCUCPFunction IOC.";
+    reference
+      "3GPP TS 28.541";
+    uses RRMPolicy_Group;
+    leaf gNBId {
+      type int64 {
+        range "0..4294967295";
+      }
+      mandatory true;
+      description
+        "Identifies a gNB within a PLMN. The gNB Identifier (gNB ID)
+         is part of the NR Cell Identifier (NCI) of the gNB cells.";
+      reference
+        "gNB ID in 3GPP TS 38.300, Global gNB ID in 3GPP TS 38.413";
+    }
+    leaf gNBIdLength {
+      type int32 {
+        range "22..32";
+      }
+      mandatory true;
+      description
+        "Indicates the number of bits for encoding the gNB ID.";
+      reference
+        "gNB ID in 3GPP TS 38.300, Global gNB ID in 3GPP TS 38.413";
+    }
+    leaf gNBCUName {
+      type string {
+        length "1..150";
+      }
+      mandatory true;
+      description
+        "Identifies the Central Unit of an gNB.";
+      reference
+        "3GPP TS 38.473";
+    }
+    list pLMNId {
+      key "mcc mnc";
+      min-elements 1;
+      max-elements 1;
+      description
+        "The PLMN identifier to be used as part of the global RAN
+         node identity.";
+      uses PLMNId;
+    }
+    leaf-list x2BlackList {
+      type DistinguishedName;
+      description
+        "List of nodes to which X2 connections are prohibited.";
+    }
+    leaf-list x2WhiteList {
+      type DistinguishedName;
+      description
+        "List of nodes to which X2 connections are enforced.";
+    }
+    leaf-list xnBlackList {
+      type DistinguishedName;
+      description
+        "List of nodes to which Xn connections are prohibited.";
+    }
+    leaf-list xnWhiteList {
+      type DistinguishedName;
+      description
+        "List of nodes to which X2 connections are enforced.";
+    }
+    leaf-list x2XnHOBlackList {
+      type DistinguishedName;
+      description
+        "List of nodes to which handovers over X2 or Xn are prohibited.";
+    }
+  } // grouping
+
+  grouping NRCellCUGroup {
+    description
+      "Represents the NRCellCU IOC.";
+    reference
+      "3GPP TS 28.541";
+    leaf cellLocalId {
+      type int32 {
+        range "0..16383";
+      }
+      mandatory true;
+      description
+        "Identifies an NR cell of a gNB. Together with corresponding
+         gNB ID it forms the NR Cell Identifier (NCI).";
+    }
+    list pLMNInfoList {
+      key "mcc mnc";
+      min-elements 1;
+      description
+        "The PLMNInfoList is a list of PLMNInfo data type. It defines which PLMNs
+         that can be served by the NR cell, and which S-NSSAIs that can be supported by the
+         NR cell for corresponding PLMN in case of network slicing feature is supported.";
+      uses PLMNInfo;
+      // Note: Whether the attribute pLMNId in the pLMNInfo can be writable depends on the implementation.
+    }
+    leaf nRFrequencyRef {
+      type DistinguishedName;
+      config false;
+      description
+        "Reference to corresponding NRFrequency instance.";
+    }
+  } // grouping
+
+  grouping NRCellRelationGroup {
+    description
+      "Represents the NRCellRelation IOC.";
+    reference
+      "3GPP TS 28.541";
+    leaf nRTCI {
+      type uint64;
+      description
+        "Target NR Cell Identifier. It consists of NR Cell
+         Identifier (NCI) and Physical Cell Identifier of the target NR cell
+         (nRPCI).";
+    }
+    container cellIndividualOffset {
+      description
+        "A set of offset values for the neighbour cell. Used when
+         UE is in connected mode. Defined for rsrpOffsetSSB, rsrqOffsetSSB,
+         sinrOffsetSSB, rsrpOffsetCSI-RS, rsrqOffsetCSI-RS and
+         sinrOffsetCSI-RS.";
+      reference
+        "cellIndividualOffset in MeasObjectNR in 3GPP TS 38.331";
+      leaf rsrpOffsetSsb {
+        type QOffsetRange;
+        default "0";
+        description
+          "Offset value of rsrpOffsetSSB.";
+      }
+      leaf rsrqOffsetSsb {
+        type QOffsetRange;
+        default "0";
+        description
+          "Offset value of rsrqOffsetSSB.";
+      }
+      leaf sinrOffsetSsb {
+        type QOffsetRange;
+        default "0";
+        description
+          "Offset value of sinrOffsetSSB.";
+      }
+      leaf rsrpOffsetCsiRs {
+        type QOffsetRange;
+        default "0";
+        description
+          "Offset value of rsrpOffsetCSI-RS.";
+      }
+      leaf rsrqOffsetCsiRs {
+        type QOffsetRange;
+        default "0";
+        description
+          "Offset value of rsrqOffsetCSI-RS.";
+      }
+      leaf sinrOffsetCsiRs {
+        type QOffsetRange;
+        default "0";
+        description
+          "Offset value of sinrOffsetCSI-RS.";
+      }
+    }
+    leaf nRFreqRelationRef {
+      type DistinguishedName;
+      mandatory true;
+      description
+        "Reference to a corresponding NRFreqRelation instance.";
+    }
+    leaf adjacentNRCellRef {
+      type DistinguishedName;
+      mandatory true;
+      description
+        "Reference to an adjacent NR cell (NRCellCU or
+         ExternalNRCellCU).";
+    }
+    leaf isRemoveAllowed {
+      type boolean;
+      default "true";
+      description
+        "True if the ANR function in the node is allowed to remove this relation.";
+    }
+    leaf isHOAllowed {
+      type boolean;
+      default "true";
+      description
+        "True if handovers are allowed over this relation.";
+    }
+  } // grouping
+
+  grouping NRFreqRelationGroup {
+    description
+      "Represents the NRFreqRelation IOC.";
+    reference
+      "3GPP TS 28.541";
+    container offsetMO {
+      description
+        "A set of offset values applicable to all measured cells
+         with reference signal(s) indicated in corresponding MeasObjectNR. It
+         is used to indicate a cell, beam or measurement object specific offset
+         to be applied when evaluating candidates for cell re-selection or when
+         evaluating triggering conditions for measurement reporting. It is
+         defined for rsrpOffsetSSB, rsrqOffsetSSB, sinrOffsetSSB,
+         rsrpOffsetCSI-RS, rsrqOffsetCSI-RS and sinrOffsetCSI-RS.";
+      reference
+        "offsetMO in MeasObjectNR in 3GPP TS 38.331";
+      leaf rsrpOffsetSsb {
+        type QOffsetRange;
+        default "0";
+        description
+          "Offset value of rsrpOffsetSSB.";
+      }
+      leaf rsrqOffsetSsb {
+        type QOffsetRange;
+        default "0";
+        description
+          "Offset value of rsrqOffsetSSB.";
+      }
+      leaf sinrOffsetSsb {
+        type QOffsetRange;
+        default "0";
+        description
+          "Offset value of sinrOffsetSSB.";
+      }
+      leaf rsrpOffsetCsiRs {
+        type QOffsetRange;
+        default "0";
+        description
+          "Offset value of rsrpOffsetCSI-RS.";
+      }
+      leaf rsrqOffsetCsiRs {
+        type QOffsetRange;
+        default "0";
+        description
+          "Offset value of rsrqOffsetCSI-RS.";
+      }
+      leaf sinrOffsetCsiRs {
+        type QOffsetRange;
+        default "0";
+        description
+          "Offset value of sinrOffsetCSI-RS.";
+      }
+    }
+    leaf-list blackListEntry {
+      type uint16 {
+        range "0..1007";
+      }
+      // min-elements 0;
+      description
+        "A list of Physical Cell Identities (PCIs) that are
+         blacklisted in NR measurements.";
+      reference
+        "3GPP TS 38.331";
+    }
+    leaf-list blackListEntryIdleMode {
+      type uint16 {
+        range "0..1007";
+      }
+      // min-elements 0;
+      description
+        "A list of Physical Cell Identities (PCIs) that are
+         blacklisted in SIB4 and SIB5.";
+    }
+    leaf cellReselectionPriority {
+      type uint32;
+      default "0";
+      description
+        "The absolute priority of the carrier frequency used by the
+         cell reselection procedure. Value 0 means lowest priority. The value
+         must not already used by other RAT, i.e. equal priorities between RATs
+         are not supported. The UE behaviour when no value is entered is
+         specified in subclause 5.2.4.1 of 3GPP TS 38.304.";
+      reference
+        "CellReselectionPriority in 3GPP TS 38.331, priority in
+         3GPP TS 38.304";
+    }
+    leaf cellReselectionSubPriority {
+      type uint8 {
+        range "2 | 4 | 6 | 8";
+      }
+      units "0.1";
+      description
+        "Indicates a fractional value to be added to the value of
+         cellReselectionPriority to obtain the absolute priority of the
+         concerned carrier frequency for E-UTRA and NR.";
+      reference
+        "3GPP TS 38.331";
+    }
+    leaf pMax {
+      type int32 {
+        range "-30..33";
+      }
+      units "dBm";
+      // mandatory false;
+      description
+        "Used for calculation of the parameter Pcompensation
+         (defined in 3GPP TS 38.304), at cell reselection to a cell.";
+      reference
+        "PEMAX in 3GPP TS 38.101";
+    }
+    leaf qOffsetFreq {
+      type QOffsetRange;
+      default "0";
+      // mandatory false;
+      description
+        "The frequency specific offset applied when evaluating
+         candidates for cell reselection.";
+    }
+    leaf qQualMin {
+      type int32 {
+        range "-34..-3 | 0";
+      }
+      units "dB";
+      default "0";
+      description
+        "Indicates the minimum required quality level in the cell.
+         Value 0 means that it is not sent and UE applies in such case the
+         (default) value of negative infinity for Qqualmin. Sent in SIB3 or
+         SIB5.";
+      reference
+        "3GPP TS 38.304";
+    }
+    leaf qRxLevMin {
+      type int32 {
+        range "-140..-44";
+      }
+      units "dBm";
+      mandatory true;
+      description
+        "Indicates the required minimum received Reference Symbol
+         Received Power (RSRP) level in the NR frequency for cell reselection.
+         Broadcast in SIB3 or SIB5, depending on whether the related frequency
+         is intra- or inter-frequency. Resolution is 2.";
+      reference
+        "3GPP TS 38.304";
+    }
+    leaf threshXHighP {
+      type int32 {
+        range "0..62";
+      }
+      units "dB";
+      mandatory true;
+      description
+        "Specifies the Srxlev threshold used by the UE when
+         reselecting towards a higher priority RAT/frequency than the current
+         serving frequency. Each frequency of NR and E-UTRAN might have a
+         specific threshold. Resolution is 2.";
+      reference
+        "ThreshX, HighP in 3GPP TS 38.304";
+    }
+    leaf threshXHighQ {
+      type int32 {
+        range "0..31";
+      }
+      units "dB";
+      mandatory true;
+      description
+        "Specifies the Squal threshold used by the UE when
+         reselecting towards a higher priority RAT/frequency than the current
+         serving frequency. Each frequency of NR and E-UTRAN might have a
+         specific threshold.";
+      reference
+        "ThreshX, HighQ in 3GPP TS 38.304";
+    }
+    leaf threshXLowP {
+      type int32 {
+        range "0..62";
+      }
+      units "dB";
+      mandatory true;
+      description
+        "Specifies the Srxlev threshold used by the UE when
+         reselecting towards a lower priority RAT/frequency than the current
+         serving frequency. Each frequency of NR and E-UTRAN might have a
+         specific threshold. Resolution is 2.";
+      reference
+        "ThreshX, LowP in 3GPP TS 38.304";
+    }
+    leaf threshXLowQ {
+      type int32 {
+        range "0..31";
+      }
+      units "dB";
+      mandatory true;
+      description
+        "Specifies the Squal threshold used by the UE when
+         reselecting towards a lower priority RAT/frequency than the current
+         serving frequency. Each frequency of NR and E-UTRAN might have a
+         specific threshold.";
+      reference
+        "ThreshX, LowQ in 3GPP TS 38.304";
+    }
+    leaf tReselectionNR {
+      type int32 {
+        range "0..7";
+      }
+      units "s";
+      mandatory true;
+      description
+        "Cell reselection timer for NR.";
+      reference
+        "TreselectionRAT for NR in 3GPP TS 38.331";
+    }
+    leaf tReselectionNRSfHigh {
+      type uint8 {
+        range "25 | 50 | 75 | 100";
+      }
+      units "%";
+      mandatory true;
+      description
+        "The attribute tReselectionNr (parameter TreselectionNR in
+         3GPP TS 38.304) is multiplied with this scaling factor if the UE is
+         in high mobility state.";
+      reference
+        "Speed dependent ScalingFactor for TreselectionNR for high
+         mobility state in 3GPP TS 38.304";
+    }
+    leaf tReselectionNRSfMedium {
+      type uint8 {
+        range "25 | 50 | 75 | 100";
+      }
+      units "%";
+      mandatory true;
+      description
+        "The attribute tReselectionNr (parameter TreselectionNR in
+         3GPP TS 38.304) multiplied with this scaling factor if the UE is in
+         medium mobility state.";
+      reference
+        "Speed dependent ScalingFactor for TreselectionNR for medium
+         mobility state in 3GPP TS 38.304";
+    }
+    leaf nRFrequencyRef {
+      type DistinguishedName;
+      mandatory true;
+      description
+        "Reference to a corresponding NRFrequency instance.";
+    }
+  } // grouping
+
+  grouping ManagedNFServiceGroup {
+    description
+      "A ManagedNFService representing a Network Function (NF) service.";
+    reference
+      "Clause 7 of 3GPP TS 23.501.";
+    leaf userLabel {
+      type string;
+      description
+        "A user-friendly (and user assignable) name of this object.";
+    }
+    list sAP {
+      key "host port";
+      min-elements 1;
+      max-elements 1;
+      description
+        "The service access point of the managed NF service instance";
+      uses SAP;
+    }
+  } // grouping
+
+  // container for RAN Network
+
+  container ran-network {
+    description
+      "Represents telecommunications equipment or
+       TMN entities within the telecommunications network providing support
+       and/or service to the subscriber.";
+    list NearRTRIC {
+      key "idNearRTRIC"; // list GNBCUCPFunction
+      description
+        "A list of expected near-real-time RIC O-RAN managed functions.";
+      leaf idNearRTRIC {
+        type string;
+        description
+          "Key leaf (namingAttribute) for a class/list.
+           Should be used as a key leaf for lists representing
+           stage 2 classes.";
+        reference
+          "3GPP TS 32.300 Name convention for managed objects";
+      }
+      container attributes {
+        description
+          "TODO";
+        uses NearRTRICGroup;
+      }
+      list GNBDUFunction {
+        key "idGNBDUFunction";
+        description
+          "Represents the logical function DU of gNB or en-gNB.";
+        reference
+          "3GPP TS 28.541";
+        leaf idGNBDUFunction {
+          type string;
+          description
+            "TODO";
+        }
+        container attributes {
+          description
+            "TODO";
+          uses GNBDUFunctionGroup;
+          uses ManagedNFServiceGroup;
+        }
+        list NRCellDU {
+          key "idNRCellDU";
+          description
+            "Represents the information of a cell known by DU.";
+          reference
+            "3GPP TS 28.541";
+          leaf idNRCellDU {
+            type string;
+            description
+              "TODO";
+          }
+          container attributes {
+            description
+              "TODO";
+            uses NRCellDUGroup;
+            uses ManagedNFServiceGroup;
+          }
+        } // list NRCellDU
+      } // list GNBDUFunction
+      list GNBCUUPFunction {
+        key "idGNBCUUPFunction";
+        description
+          "TODO";
+        leaf idGNBCUUPFunction {
+          type string;
+          description
+            "TODO";
+        }
+        container attributes {
+          description
+            "TODO";
+          uses GNBCUUPFunctionGroup;
+          uses ManagedNFServiceGroup;
+        }
+      } // list GNBCUUPFunction
+      list GNBCUCPFunction {
+        key "idGNBCUCPFunction"; // list NRCellCU
+        description
+          "Represents the logical function CU-CP of gNB and en-gNB.";
+        reference
+          "3GPP TS 28.541";
+        leaf idGNBCUCPFunction {
+          type string;
+          description
+            "TODO";
+        }
+        container attributes {
+          description
+            "TODO";
+          uses GNBCUCPFunctionGroup;
+          uses ManagedNFServiceGroup;
+        }
+        list NRCellCU {
+          key "idNRCellCU";
+          description
+            "Represents the information required by CU that is
+             responsible for the management of inter-cell mobility and neighbour
+             relations via ANR.";
+          reference
+            "3GPP TS 28.541";
+          leaf idNRCellCU {
+            type string;
+            description
+              "TODO";
+          }
+          container attributes {
+            description
+              "TODO";
+            uses NRCellCUGroup;
+            uses ManagedNFServiceGroup;
+          }
+          list NRCellRelation {
+            key "idNRCellRelation";
+            description
+              "Represents a neighbour cell relation from a source cell
+               to a target cell, where the target cell is an NRCellCU or
+               ExternalNRCellCU instance.";
+            reference
+              "3GPP TS 28.541";
+            leaf idNRCellRelation {
+              type string;
+              description
+                "TODO";
+            }
+            container attributes {
+              description
+                "TODO";
+              uses NRCellRelationGroup;
+              uses ManagedNFServiceGroup;
+            }
+          } // list NRCellRelation
+          list NRFreqRelation {
+            key "idNRFreqRelation";
+            description
+              "Together with the target NRFrequency, it represents the
+               frequency properties applicable to the referencing NRFreqRelation.";
+            reference
+              "3GPP TS 28.541";
+            leaf idNRFreqRelation {
+              type string;
+              description
+                "TODO";
+            }
+            container attributes {
+              description
+                "TODO";
+              uses NRFreqRelationGroup;
+              uses ManagedNFServiceGroup;
+            }
+          } // list NRFreqRelation
+        }
+      }
+    } // list ManagedElement
+  }
+}
diff --git a/sdnr/northbound/ranSlice/model/src/main/yang/ran-slice-api@2020-08-06.yang b/sdnr/northbound/ranSlice/model/src/main/yang/ran-slice-api@2020-08-06.yang
new file mode 100644
index 0000000..3253a01
--- /dev/null
+++ b/sdnr/northbound/ranSlice/model/src/main/yang/ran-slice-api@2020-08-06.yang
@@ -0,0 +1,466 @@
+/*
+ * Yang model for the RANSLice Northbound API's
+ *
+ */
+module ran-slice-api {
+  yang-version 1.1;
+  namespace "org:onap:ccsdk";
+  prefix rs;
+
+  organization
+    "Open Network Automation Platform - ONAP
+     <https://www.onap.org>";
+  contact
+    "Editors:
+       Sandeep Shah
+       <mailto:sandeep.shah@ibm.com>
+
+       Swaminathan Seetharaman
+       <mailto:swaminathan.seetharaman@wipro.com>";
+  description
+    "This module defines the services and request/response requirements for
+     RAN Slice Management.
+     This YANG model is used solely for POC's in the ONAP and O-RAN communities
+
+     Copyright 2020 the O-RAN Alliance.
+
+     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.";
+
+  revision 2020-08-06 {
+    description
+      "RANSlice API YANG Model";
+    reference
+      "https://wiki.onap.org/display/DW/E2E+Network+Slicing+Use+Case+in+R7+Guilin";
+  }
+
+    /**********************************************************************************
+     * Data type definitions
+     *
+     * The following data type definitions are used to define common data structures,
+     * define constraints, or to impart special meanings to data objects related to the
+     * SDN-R controller functions.
+     **********************************************************************************/
+
+  typedef ZULU {
+    type string {
+      length "16..28";
+      pattern '[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}.[0-9]{1,6}Z';
+    }
+    description
+      "Define a common definition of a time stamp (expressed as a formatted
+       string) as follows yyyy-MM-ddTHH:mm:ss.SSSSSSSSZ";
+  }
+
+  typedef payload {
+    type string;
+    description
+      "The payload can be any valid JSON string value. Json escape characters
+       need to be added when required to include an inner json within the
+       payload to make it a valid json string value";
+  }
+
+  typedef action {
+    type enumeration {
+      enum allocate {
+        description
+          "TODO";
+      }
+      enum modify {
+        description
+          "TODO";
+      }
+      enum modify-allocate {
+        description
+          "TODO";
+      }
+      enum modify-deallocate {
+        description
+          "TODO";
+      }
+      enum deallocate {
+        description
+          "TODO";
+      }
+      enum activate {
+        description
+          "TODO";
+      }
+      enum deactivate {
+        description
+          "TODO";
+      }
+      enum reconfigure {
+        description
+          "TODO";
+      }
+    }
+    description
+      "The action to be taken by SDN-R for invoked RPC.";
+  }
+
+  typedef ranSlice-action-status {
+    type enumeration {
+      enum IN_PROGRESS {
+        description
+          "TODO";
+        }
+      enum SUCCESSFUL {
+        description
+          "TODO";
+        }
+      enum FAILED {
+        description
+          "TODO";
+        }
+      enum NOT_FOUND {
+        description
+          "TODO";
+        }
+      enum ABORTED {
+        description
+          "TODO";
+        }
+      enum MULTIPLE_REQUESTS_FOUND {
+        description
+          "TODO";
+        }
+    }
+    description
+      "The status of the requested RANSlice action";
+  }
+
+  /**********************************************************************************
+   * All requests will include this standard header
+   *
+   * The standard request header is used to define a correlation identification for
+   * the request that is returned on all responses.  This correlation identifier
+   * (called the service-request-id) is meaningful to the caller and is included on
+   * all responses from the services.
+   **********************************************************************************/
+
+  /**********************************************************************************
+   * All responses will include this standard header
+   *
+   * The standard response header includes the time of completion as well as a
+   * success|failure indication
+   **********************************************************************************/
+
+  grouping common-header {
+    description
+      "A common header for all SDN-R requests";
+    container common-header {
+      description
+        "A common header for all SDN-R requests";
+      leaf timestamp {
+        type ZULU;
+        mandatory true;
+        description
+          "timestamp is in ISO 8601 timestamp format ZULU offset";
+      }
+      leaf api-ver {
+        type string;
+        mandatory true;
+        description
+          "api-ver is the API version identifier. A given release of APPC
+              should support all previous versions of APPC API (correlate with
+              general requirements)";
+      }
+      leaf originator-id {
+        type string;
+        mandatory true;
+        description
+          "originator-id an identifier of the calling system which can be
+              used addressing purposes, i.e. returning asynchronous response
+              to the proper destination over DMaaP (especially in case of multiple
+              consumers of SDN-R APIs)";
+      }
+      leaf request-id {
+        type string;
+        mandatory true;
+        description
+          "UUID for the request ID. An OSS/BSS identifier for the request
+              that caused the current action. Multiple API calls may be made
+              with the same request-id The request-id shall be recorded throughout
+              the operations on a single request";
+      }
+      leaf sub-request-id {
+        type string;
+        description
+          "Uniquely identifies a specific RANSlice action. It is persistent over
+              the life-cycle of a single request";
+      }
+
+      /**********************************************************************************
+       * Flags are generic flags that apply to any and all commands, all are optional
+       *  force = TRUE/FALSE - Execute command even if target is in unstable (i.e. locked, transiting, etc)
+       *                       state. Specific behaviour of forced commands varies, but implies cancellation
+       *                       of previous command and an override by the new command. The FALSE value is
+       *                       used by default.
+       *  ttl = <0....N> - The timeout value for command execution, expressed in seconds
+       *  mode = EXCLUSIVE/NORMAL - defines execution mode as follows:
+       *        - EXCLUSIVE ? on encountering an exclusive command, the SDN-R will:
+       *          * Cease accepting additional command requests
+       *          * Complete execution of outstanding commands
+       *          * Execute the exclusive command to completion
+       *          * Optionally report the result of the command
+       *          * Optionally resume command acceptance and processing
+       *        - NORMAL - Obverse of EXCLUSIVE, the default one.
+       **********************************************************************************/
+      container flags {
+        description
+          "Flags are generic flags that apply to any and all commands, all are optional";
+        leaf mode {
+          type enumeration {
+            enum EXCLUSIVE {
+              description
+                "TODO";
+            }
+            enum NORMAL {
+              description
+                "TODO";
+            }
+          }
+          description
+            "EXCLUSIVE (accept no queued requests on this VNF while processing)
+                    or NORMAL (queue other requests until complete)";
+          }
+        leaf force {
+          type enumeration {
+            enum TRUE {
+              description
+                "TODO";
+            }
+            enum FALSE {
+              description
+                "TODO";
+            }
+          }
+            description
+            "TRUE/FALSE - Execute action even if target is in unstable (i.e.
+                    locked, transiting, etc.) state";
+        }
+        leaf ttl {
+          type uint16;
+            description
+            "<0....N> - The timeout value (expressed in seconds) for action
+                    execution, between action being received by APPC and action initiation";
+        }
+      }
+    }
+  }
+
+  grouping status {
+    description
+      "The specific response codes are to be aligned with SDC reference doc
+       (main table removed to avoid duplication and digression from main table).
+       See SDC and ECOMP Distribution Consumer Interface Agreement";
+    container status {
+      description
+        "The specific response codes are to be aligned with SDC reference doc
+         (main table removed to avoid duplication and digression from main table).
+         See SDC and ECOMP Distribution Consumer Interface Agreement";
+      leaf code {
+        type uint16;
+        mandatory true;
+        description
+          "Response code";
+      }
+      leaf message {
+        type string;
+        mandatory true;
+        description
+          "Response message";
+      }
+    }
+  }
+
+  grouping abstract-rpc-input {
+      uses common-header;
+      leaf action {
+        type action;
+        mandatory true;
+        description
+          "TODO";
+      }
+      leaf payload {
+        type payload;
+        description
+          "TODO";
+      }
+    description
+      "An abstract rpc output defintion.";
+  }
+  grouping abstract-rpc-input-payload-required {
+      uses common-header;
+      leaf action {
+        type action;
+        mandatory true;
+        description
+          "TODO";
+      }
+      leaf payload {
+        type payload;
+        mandatory true;
+        description
+          "TODO";
+      }
+    description
+      "An abstract rpc output defintion.";
+  }
+  grouping abstract-rpc-output {
+    uses common-header;
+    uses status;
+    description
+      "An abstract rpc output defintion.";
+  }
+  /**********************************************************************************
+   * Define the configureNearRTRIC service
+   **********************************************************************************/
+  rpc configureNearRTRIC {
+    description
+      "An operation to configure Near-Time RIC in the preparation phase";
+    input {
+      uses abstract-rpc-input;
+    }
+    output {
+      uses abstract-rpc-output;
+    }
+  }
+
+  /**********************************************************************************
+   * Define the instantiateRANSlice service
+   **********************************************************************************/
+  rpc instantiateRANSlice {
+    description
+      "An operation to instantiate RAN slice. Includes both allocation and configuration of RAN slice resources";
+    input {
+      uses abstract-rpc-input;
+    }
+    output {
+      uses abstract-rpc-output;
+    }
+  }
+
+  /**********************************************************************************
+   * Define the configureRANSliceInstance service
+   **********************************************************************************/
+  rpc configureRANSliceInstance {
+    description
+      "An operation to configure RAN slice NSSI in CU and DU";
+    input {
+      uses abstract-rpc-input;
+    }
+    output {
+      uses abstract-rpc-output;
+    }
+  }
+
+  /**********************************************************************************
+   * Define the configureCU service
+   **********************************************************************************/
+  rpc configureCU {
+    description
+      "An operation to configure CU in the preparation phase";
+    input {
+      uses abstract-rpc-input;
+    }
+    output {
+      uses abstract-rpc-output;
+    }
+  }
+
+  /**********************************************************************************
+   * Define the configureDU service
+   **********************************************************************************/
+  rpc configureDU {
+    description
+      "An operation to configure DU in the preparation phase";
+    input {
+      uses abstract-rpc-input;
+    }
+    output {
+      uses abstract-rpc-output;
+    }
+  }
+
+  /**********************************************************************************
+   * Define the activateRANSliceInstance service ... needed to enable traffic flow
+   **********************************************************************************/
+  rpc activateRANSliceInstance {
+    description
+      "An operation to reallocate RAN Slice resources";
+      input {
+        uses abstract-rpc-input;
+      }
+      output {
+        uses abstract-rpc-output;
+      }
+  }
+
+  /**********************************************************************************
+   * Define the deactivateRANSliceInstance service ... needed to disable traffic flow
+   **********************************************************************************/
+  rpc deactivateRANSliceInstance {
+    description
+      "An operation to reallocate RAN Slice resources";
+      input {
+        uses abstract-rpc-input;
+      }
+      output {
+        uses abstract-rpc-output;
+      }
+  }
+
+  /**********************************************************************************
+   * Define the terminateRANSliceInstance service
+   **********************************************************************************/
+  rpc terminateRANSliceInstance {
+    description
+      "An operation to terminate RAN slide instance";
+      input {
+        uses abstract-rpc-input;
+      }
+      output {
+        uses abstract-rpc-output;
+      }
+  }
+
+
+  /**********************************************************************************
+   * Define the determineRANSliceResources service
+   **********************************************************************************/
+  rpc determineRANSliceResources {
+    description
+      "An operation to determine RAN slice resources";
+      input {
+        uses abstract-rpc-input;
+      }
+      output {
+        uses abstract-rpc-output;
+      }
+  }
+
+  /**********************************************************************************
+   * Define the configNotification service
+   **********************************************************************************/
+  rpc configNotification {
+    description
+      "CM Notify event triggered by DMAAP VES message";
+      input {
+        uses abstract-rpc-input;
+      }
+      output {
+        uses abstract-rpc-output;
+      }
+  }
+}
diff --git a/sdnr/northbound/ranSlice/pom.xml b/sdnr/northbound/ranSlice/pom.xml
new file mode 100644
index 0000000..75bd9a7
--- /dev/null
+++ b/sdnr/northbound/ranSlice/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ ============LICENSE_START=======================================================
+  ~ ONAP : ccsdk features
+  ~ ================================================================================
+  ~ Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+  ~ ================================================================================
+  ~ 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.
+  ~ ============LICENSE_END=======================================================
+  ~
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>odlparent-lite</artifactId>
+        <version>2.0.1-SNAPSHOT</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.onap.ccsdk.features.sdnr.northbound</groupId>
+    <artifactId>ranSlice</artifactId>
+    <version>1.0.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <name>ccsdk-features :: sdnr-northbound :: ${project.artifactId}</name>
+
+    <modules>
+        <module>model</module>
+        <module>feature</module>
+        <module>provider</module>
+        <module>installer</module>
+    </modules>
+
+    <properties>
+        <feature-name>ranSlice</feature-name>
+    </properties>
+</project>
diff --git a/sdnr/northbound/ranSlice/provider/derby.log b/sdnr/northbound/ranSlice/provider/derby.log
new file mode 100644
index 0000000..33ad15c
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/derby.log
@@ -0,0 +1,13 @@
+----------------------------------------------------------------
+Mon Aug 17 21:43:27 CDT 2020:
+Booting Derby version The Apache Software Foundation - Apache Derby - 10.14.2.0 - (1828579): instance a816c00e-0173-ff73-3522-00001953d118 
+on database directory memory:/home/sandeepos/SON-ONAP-ATT/Gulian/FINAL-GULIAN-AUG15-USE/ccsdk/features/sdnr/northbound/ranSlice/provider/sdnctl with class loader sun.misc.Launcher$AppClassLoader@18b4aac2 
+Loaded from file:/home/sandeepos/.m2/repository/org/apache/derby/derby/10.14.2.0/derby-10.14.2.0.jar
+java.vendor=Private Build
+java.runtime.version=1.8.0_265-8u265-b01-0ubuntu2~16.04-b01
+user.dir=/home/sandeepos/SON-ONAP-ATT/Gulian/FINAL-GULIAN-AUG15-USE/ccsdk/features/sdnr/northbound/ranSlice/provider
+os.name=Linux
+os.arch=amd64
+os.version=4.15.0-112-generic
+derby.system.home=null
+Database Class Loader started - derby.database.classpath=''
diff --git a/sdnr/northbound/ranSlice/provider/pom.xml b/sdnr/northbound/ranSlice/provider/pom.xml
new file mode 100644
index 0000000..ba92a0a
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/pom.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ ============LICENSE_START=======================================================
+  ~ ONAP : ccsdk features
+  ~ ================================================================================
+  ~ Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+  ~ ================================================================================
+  ~ 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.
+  ~ ============LICENSE_END=======================================================
+  ~
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>binding-parent</artifactId>
+        <version>2.0.1-SNAPSHOT</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.onap.ccsdk.features.sdnr.northbound</groupId>
+    <artifactId>ranSlice-provider</artifactId>
+    <version>1.0.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+
+    <name>ccsdk-features :: sdnr-northbound :: ${project.artifactId}</name>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.opendaylight.controller</groupId>
+                <artifactId>mdsal-artifacts</artifactId>
+                <version>1.6.1</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.onap.ccsdk.sli.core</groupId>
+                <artifactId>sli-core-artifacts</artifactId>
+                <version>${ccsdk.sli.core.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.ccsdk.features.sdnr.northbound</groupId>
+            <artifactId>ranSlice-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <!--
+        <dependency>
+          <groupId>org.opendaylight.controller</groupId>
+          <artifactId>sal-binding-config</artifactId>
+        </dependency>
+        -->
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-common-util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-core-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-broker-impl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-data-impl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.derby</groupId>
+            <artifactId>derby</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.core</groupId>
+            <artifactId>sli-common</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.core</groupId>
+            <artifactId>sli-provider</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.core</groupId>
+            <artifactId>utils-provider</artifactId>
+            <!-- <version>${sdnctl.sli.version}</version> -->
+        </dependency>
+        <dependency>
+    			<groupId>org.osgi</groupId>
+    			<artifactId>org.osgi.core</artifactId>
+    			<scope>test</scope>
+  		</dependency>
+      <dependency>
+          <groupId>org.onap.ccsdk.sli.core</groupId>
+          <artifactId>sli-provider-base</artifactId>
+          <version>${ccsdk.sli.core.version}</version>
+      </dependency>
+    </dependencies>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.eclipse.m2e</groupId>
+                    <artifactId>lifecycle-mapping</artifactId>
+                    <version>1.0.0</version>
+                    <configuration>
+                        <lifecycleMappingMetadata>
+                            <pluginExecutions>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.codehaus.mojo</groupId>
+                                        <artifactId>properties-maven-plugin</artifactId>
+                                        <versionRange>[1.0.0,)</versionRange>
+                                        <goals>
+                                            <goal>set-system-properties</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <execute/>
+                                    </action>
+                                </pluginExecution>
+                            </pluginExecutions>
+                        </lifecycleMappingMetadata>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+</project>
diff --git a/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceClient.java b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceClient.java
new file mode 100644
index 0000000..f3d2a7d
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceClient.java
@@ -0,0 +1,99 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * 			reserved.
+ * Modifications Copyright © 2018 IBM.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.ccsdk.features.sdnr.northbound.ranSlice;
+
+
+import java.util.Properties;
+
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicService;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RANSliceClient {
+
+	private static final Logger LOG = LoggerFactory.getLogger(RANSliceClient.class);
+
+	private final SvcLogicService svcLogicService;
+
+	private String ErrorCode = "error-code";
+
+	public RANSliceClient(final SvcLogicService svcLogicService) {
+		this.svcLogicService = svcLogicService;
+	}
+
+	public boolean hasGraph(String module, String rpc, String version, String mode) throws SvcLogicException
+	{
+		return svcLogicService.hasGraph(module, rpc, version, mode);
+	}
+
+
+	public Properties execute(String module, String rpc, String version, String mode, Properties parms, DOMDataBroker dataBroker)
+				throws SvcLogicException {
+
+
+		if (LOG.isDebugEnabled())
+		{
+			LOG.debug("Parameters passed to SLI");
+
+			for (Object key : parms.keySet()) {
+				String parmName = (String) key;
+				String parmValue = parms.getProperty(parmName);
+
+				LOG.debug(parmName+" = "+parmValue);
+
+			}
+		}
+
+		Properties respProps = svcLogicService.execute(module, rpc, version, mode, parms, dataBroker);
+
+		if (LOG.isDebugEnabled())
+		{
+			LOG.debug("Parameters returned by SLI");
+
+			for (Object key : respProps.keySet()) {
+				String parmName = (String) key;
+				String parmValue = respProps.getProperty(parmName);
+
+				LOG.debug(parmName+" = "+parmValue);
+
+			}
+		}
+
+		if ("failure".equalsIgnoreCase(respProps.getProperty("SvcLogic.status"))) {
+
+			if (!respProps.containsKey(ErrorCode)) {
+				respProps.setProperty(ErrorCode, "500");
+			}
+		} else {
+			if (!respProps.containsKey(ErrorCode)) {
+				respProps.setProperty(ErrorCode, "200");
+			}
+		}
+
+
+		return respProps;
+	}
+
+}
diff --git a/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceProvider.java b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceProvider.java
new file mode 100644
index 0000000..a88595b
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceProvider.java
@@ -0,0 +1,480 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * 			reserved.
+ * 	Modifications Copyright © 2018 IBM.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.ccsdk.features.sdnr.northbound.ranSlice;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Properties;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import org.onap.ccsdk.sli.core.sli.provider.MdsalHelper;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
+import org.opendaylight.controller.md.sal.binding.impl.AbstractForwardedDataBroker;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.*;
+import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.common.header.CommonHeaderBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.status.StatusBuilder;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+
+import org.onap.ccsdk.features.sdnr.northbound.ranSlice.RANSliceResponseCode.*;
+
+/**
+ * Defines a base implementation for your provider. This class extends from a
+ * helper class which provides storage for the most commonly used components of
+ * the MD-SAL. Additionally the base class provides some basic logging and
+ * initialization / clean up methods.
+ *
+ */
+public class RANSliceProvider implements AutoCloseable, RanSliceApiService {
+
+	private class CommonRANSliceFields {
+		private StatusBuilder statusBuilder;
+		private CommonHeaderBuilder commonHeaderBuilder;
+		private Payload payload;
+
+		public CommonRANSliceFields(StatusBuilder statusBuilder, CommonHeaderBuilder commonHeaderBuilder) {
+			this.statusBuilder = statusBuilder;
+			this.commonHeaderBuilder = commonHeaderBuilder;
+			this.payload = null;
+		}
+
+		public CommonRANSliceFields(StatusBuilder statusBuilder, CommonHeaderBuilder commonHeaderBuilder, Payload payload) {
+			this.statusBuilder = statusBuilder;
+			this.commonHeaderBuilder = commonHeaderBuilder;
+			this.payload = payload;
+		}
+
+		public StatusBuilder getStatusBuilder() {
+			return statusBuilder;
+		}
+
+		public CommonHeaderBuilder getCommonHeaderBuilder() {
+			return commonHeaderBuilder;
+		}
+
+		public Payload getPayload() {
+			return payload;
+		}
+	}
+
+	private static final Logger LOG = LoggerFactory.getLogger(RANSliceProvider.class);
+
+	private static final String exceptionMessage = "Caught exception";
+
+	private static final String APPLICATION_NAME = "RANSlice";
+
+	private final ExecutorService executor;
+	protected DataBroker dataBroker;
+	protected DOMDataBroker domDataBroker;
+	protected NotificationPublishService notificationService;
+	protected RpcProviderRegistry rpcRegistry;
+	private final RANSliceClient RANSliceClient;
+
+	protected BindingAwareBroker.RpcRegistration<RanSliceApiService> rpcRegistration;
+
+	public RANSliceProvider(final DataBroker dataBroker, final NotificationPublishService notificationPublishService,
+			final RpcProviderRegistry rpcProviderRegistry, final RANSliceClient rANSliceClient) {
+
+		LOG.info("Creating provider for {}", APPLICATION_NAME);
+		executor = Executors.newFixedThreadPool(1);
+		this.dataBroker = dataBroker;
+		if (dataBroker instanceof AbstractForwardedDataBroker) {
+			domDataBroker = ((AbstractForwardedDataBroker) dataBroker).getDelegate();
+		}
+		notificationService = notificationPublishService;
+		rpcRegistry = rpcProviderRegistry;
+		this.RANSliceClient = rANSliceClient;
+		initialize();
+	}
+
+	public void initialize() {
+		LOG.info("Initializing {} for {}", this.getClass().getName(), APPLICATION_NAME);
+
+		if (rpcRegistration == null) {
+			if (rpcRegistry != null) {
+				rpcRegistration = rpcRegistry.addRpcImplementation(RanSliceApiService.class, this);
+				LOG.info("Initialization complete for {}", APPLICATION_NAME);
+			} else {
+				LOG.warn("Error initializing {} : rpcRegistry unset", APPLICATION_NAME);
+			}
+		}
+	}
+
+	protected void initializeChild() {
+		// Override if you have custom initialization intelligence
+	}
+
+	@Override
+	public void close() throws Exception {
+		LOG.info("Closing provider for " + APPLICATION_NAME);
+		executor.shutdown();
+		rpcRegistration.close();
+		LOG.info("Successfully closed provider for " + APPLICATION_NAME);
+	}
+
+
+//RPC configureNearRTRIC
+
+	@Override
+	public ListenableFuture<RpcResult<ConfigureNearRTRICOutput>> configureNearRTRIC(ConfigureNearRTRICInput input) {
+		ConfigureNearRTRICInputBuilder iBuilder = new ConfigureNearRTRICInputBuilder(input);
+		ConfigureNearRTRICOutputBuilder oBuilder = new ConfigureNearRTRICOutputBuilder();
+
+		try {
+			CommonRANSliceFields retval = callDG("configureNearRTRIC", iBuilder.build());
+			oBuilder.setStatus(retval.getStatusBuilder().build());
+			oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build());
+		} catch (RANSliceRpcInvocationException e) {
+			LOG.debug(exceptionMessage, e);
+			oBuilder.setCommonHeader(e.getCommonHeader());
+			oBuilder.setStatus(e.getStatus());
+		}
+
+		RpcResult<ConfigureNearRTRICOutput> rpcResult =
+				RpcResultBuilder.<ConfigureNearRTRICOutput> status(true).withResult(oBuilder.build()).build();
+		// return error
+		return Futures.immediateFuture(rpcResult);
+
+	}
+
+	//RPC instantiateRANSlice
+
+	@Override
+	public ListenableFuture<RpcResult<InstantiateRANSliceOutput>> instantiateRANSlice(InstantiateRANSliceInput input) {
+		InstantiateRANSliceInputBuilder iBuilder = new InstantiateRANSliceInputBuilder(input);
+		InstantiateRANSliceOutputBuilder oBuilder = new InstantiateRANSliceOutputBuilder();
+
+		try {
+			CommonRANSliceFields retval = callDG("instantiateRANSlice", iBuilder.build());
+			oBuilder.setStatus(retval.getStatusBuilder().build());
+			oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build());
+		} catch (RANSliceRpcInvocationException e) {
+			LOG.debug(exceptionMessage, e);
+			oBuilder.setCommonHeader(e.getCommonHeader());
+			oBuilder.setStatus(e.getStatus());
+		}
+
+		RpcResult<InstantiateRANSliceOutput> rpcResult =
+				RpcResultBuilder.<InstantiateRANSliceOutput> status(true).withResult(oBuilder.build()).build();
+		// return error
+		return Futures.immediateFuture(rpcResult);
+
+	}
+
+
+
+	//RPC configureRANSliceInstance
+
+	@Override
+	public ListenableFuture<RpcResult<ConfigureRANSliceInstanceOutput>> configureRANSliceInstance(ConfigureRANSliceInstanceInput input) {
+		ConfigureRANSliceInstanceInputBuilder iBuilder = new ConfigureRANSliceInstanceInputBuilder(input);
+		ConfigureRANSliceInstanceOutputBuilder oBuilder = new ConfigureRANSliceInstanceOutputBuilder();
+
+		try {
+			CommonRANSliceFields retval = callDG("configureRANSliceInstance", iBuilder.build());
+			oBuilder.setStatus(retval.getStatusBuilder().build());
+			oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build());
+		} catch (RANSliceRpcInvocationException e) {
+			LOG.debug(exceptionMessage, e);
+			oBuilder.setCommonHeader(e.getCommonHeader());
+			oBuilder.setStatus(e.getStatus());
+		}
+
+		RpcResult<ConfigureRANSliceInstanceOutput> rpcResult =
+				RpcResultBuilder.<ConfigureRANSliceInstanceOutput> status(true).withResult(oBuilder.build()).build();
+		// return error
+		return Futures.immediateFuture(rpcResult);
+
+	}
+
+	//RPC configureCU
+
+	@Override
+	public ListenableFuture<RpcResult<ConfigureCUOutput>> configureCU(ConfigureCUInput input) {
+		ConfigureCUInputBuilder iBuilder = new ConfigureCUInputBuilder(input);
+		ConfigureCUOutputBuilder oBuilder = new ConfigureCUOutputBuilder();
+
+		try {
+			CommonRANSliceFields retval = callDG("configureCU", iBuilder.build());
+			oBuilder.setStatus(retval.getStatusBuilder().build());
+			oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build());
+		} catch (RANSliceRpcInvocationException e) {
+			LOG.debug(exceptionMessage, e);
+			oBuilder.setCommonHeader(e.getCommonHeader());
+			oBuilder.setStatus(e.getStatus());
+		}
+
+		RpcResult<ConfigureCUOutput> rpcResult =
+				RpcResultBuilder.<ConfigureCUOutput> status(true).withResult(oBuilder.build()).build();
+		// return error
+		return Futures.immediateFuture(rpcResult);
+
+	}
+
+	//RPC configureDU
+
+	@Override
+	public ListenableFuture<RpcResult<ConfigureDUOutput>> configureDU(ConfigureDUInput input) {
+		ConfigureDUInputBuilder iBuilder = new ConfigureDUInputBuilder(input);
+		ConfigureDUOutputBuilder oBuilder = new ConfigureDUOutputBuilder();
+
+		try {
+			CommonRANSliceFields retval = callDG("configureDU", iBuilder.build());
+			oBuilder.setStatus(retval.getStatusBuilder().build());
+			oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build());
+		} catch (RANSliceRpcInvocationException e) {
+			LOG.debug(exceptionMessage, e);
+			oBuilder.setCommonHeader(e.getCommonHeader());
+			oBuilder.setStatus(e.getStatus());
+		}
+
+		RpcResult<ConfigureDUOutput> rpcResult =
+				RpcResultBuilder.<ConfigureDUOutput> status(true).withResult(oBuilder.build()).build();
+		// return error
+		return Futures.immediateFuture(rpcResult);
+
+	}
+
+	//RPC activateRANSliceInstance
+
+	@Override
+	public ListenableFuture<RpcResult<ActivateRANSliceInstanceOutput>> activateRANSliceInstance(ActivateRANSliceInstanceInput input) {
+		ActivateRANSliceInstanceInputBuilder iBuilder = new ActivateRANSliceInstanceInputBuilder(input);
+		ActivateRANSliceInstanceOutputBuilder oBuilder = new ActivateRANSliceInstanceOutputBuilder();
+
+		try {
+			CommonRANSliceFields retval = callDG("activateRANSliceInstance", iBuilder.build());
+			oBuilder.setStatus(retval.getStatusBuilder().build());
+			oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build());
+		} catch (RANSliceRpcInvocationException e) {
+			LOG.debug(exceptionMessage, e);
+			oBuilder.setCommonHeader(e.getCommonHeader());
+			oBuilder.setStatus(e.getStatus());
+		}
+
+		RpcResult<ActivateRANSliceInstanceOutput> rpcResult =
+				RpcResultBuilder.<ActivateRANSliceInstanceOutput> status(true).withResult(oBuilder.build()).build();
+		// return error
+		return Futures.immediateFuture(rpcResult);
+
+	}
+
+
+	//RPC deactivateRANSliceInstance
+
+	@Override
+	public ListenableFuture<RpcResult<DeactivateRANSliceInstanceOutput>> deactivateRANSliceInstance(DeactivateRANSliceInstanceInput input) {
+		DeactivateRANSliceInstanceInputBuilder iBuilder = new DeactivateRANSliceInstanceInputBuilder(input);
+		DeactivateRANSliceInstanceOutputBuilder oBuilder = new DeactivateRANSliceInstanceOutputBuilder();
+
+		try {
+			CommonRANSliceFields retval = callDG("deactivateRANSliceInstance", iBuilder.build());
+			oBuilder.setStatus(retval.getStatusBuilder().build());
+			oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build());
+		} catch (RANSliceRpcInvocationException e) {
+			LOG.debug(exceptionMessage, e);
+			oBuilder.setCommonHeader(e.getCommonHeader());
+			oBuilder.setStatus(e.getStatus());
+		}
+
+		RpcResult<DeactivateRANSliceInstanceOutput> rpcResult =
+				RpcResultBuilder.<DeactivateRANSliceInstanceOutput> status(true).withResult(oBuilder.build()).build();
+		// return error
+		return Futures.immediateFuture(rpcResult);
+
+	}
+
+	//RPC terminateRANSliceInstance
+
+	@Override
+	public ListenableFuture<RpcResult<TerminateRANSliceInstanceOutput>> terminateRANSliceInstance(TerminateRANSliceInstanceInput input) {
+		TerminateRANSliceInstanceInputBuilder iBuilder = new TerminateRANSliceInstanceInputBuilder(input);
+		TerminateRANSliceInstanceOutputBuilder oBuilder = new TerminateRANSliceInstanceOutputBuilder();
+
+		try {
+			CommonRANSliceFields retval = callDG("terminateRANSliceInstance", iBuilder.build());
+			oBuilder.setStatus(retval.getStatusBuilder().build());
+			oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build());
+		} catch (RANSliceRpcInvocationException e) {
+			LOG.debug(exceptionMessage, e);
+			oBuilder.setCommonHeader(e.getCommonHeader());
+			oBuilder.setStatus(e.getStatus());
+		}
+
+		RpcResult<TerminateRANSliceInstanceOutput> rpcResult =
+				RpcResultBuilder.<TerminateRANSliceInstanceOutput> status(true).withResult(oBuilder.build()).build();
+		// return error
+		return Futures.immediateFuture(rpcResult);
+
+	}
+
+	//RPC determineRANSliceResources
+
+	@Override
+	public ListenableFuture<RpcResult<DetermineRANSliceResourcesOutput>> determineRANSliceResources(DetermineRANSliceResourcesInput input) {
+		DetermineRANSliceResourcesInputBuilder iBuilder = new DetermineRANSliceResourcesInputBuilder(input);
+		DetermineRANSliceResourcesOutputBuilder oBuilder = new DetermineRANSliceResourcesOutputBuilder();
+
+		try {
+			CommonRANSliceFields retval = callDG("determineRANSliceResources", iBuilder.build());
+			oBuilder.setStatus(retval.getStatusBuilder().build());
+			oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build());
+		} catch (RANSliceRpcInvocationException e) {
+			LOG.debug(exceptionMessage, e);
+			oBuilder.setCommonHeader(e.getCommonHeader());
+			oBuilder.setStatus(e.getStatus());
+		}
+
+		RpcResult<DetermineRANSliceResourcesOutput> rpcResult =
+				RpcResultBuilder.<DetermineRANSliceResourcesOutput> status(true).withResult(oBuilder.build()).build();
+		// return error
+		return Futures.immediateFuture(rpcResult);
+
+	}
+
+	//RPC cm-notify
+
+	@Override
+	public ListenableFuture<RpcResult<ConfigNotificationOutput>> configNotification(ConfigNotificationInput input) {
+
+		ConfigNotificationInputBuilder iBuilder = new ConfigNotificationInputBuilder(input);
+		ConfigNotificationOutputBuilder oBuilder = new ConfigNotificationOutputBuilder();
+
+		try {
+			CommonRANSliceFields retval = callDG("configNotification", iBuilder.build());
+			oBuilder.setStatus(retval.getStatusBuilder().build());
+			oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build());
+		} catch (RANSliceRpcInvocationException e) {
+			LOG.debug(exceptionMessage, e);
+			oBuilder.setCommonHeader(e.getCommonHeader());
+			oBuilder.setStatus(e.getStatus());
+		}
+
+		RpcResult<ConfigNotificationOutput> rpcResult =
+				RpcResultBuilder.<ConfigNotificationOutput> status(true).withResult(oBuilder.build()).build();
+		// return error
+		return Futures.immediateFuture(rpcResult);
+
+	}
+
+
+	private CommonRANSliceFields callDG(String rpcName, Object input) throws RANSliceRpcInvocationException {
+
+		StatusBuilder statusBuilder = new StatusBuilder();
+
+		if (input == null) {
+			LOG.debug("Rejecting " +rpcName+ " because of invalid input");
+			statusBuilder.setCode(RANSliceResponseCode.REJECT_INVALID_INPUT.getValue());
+			statusBuilder.setMessage("REJECT - INVALID INPUT.  Missing input");
+			CommonHeaderBuilder hBuilder = new CommonHeaderBuilder();
+			hBuilder.setApiVer("1");
+			hBuilder.setOriginatorId("unknown");
+			hBuilder.setRequestId("unset");
+			hBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date())));
+			throw new RANSliceRpcInvocationException(statusBuilder.build(), hBuilder.build());
+		}
+
+		CommonHeaderBuilder hBuilder = new CommonHeaderBuilder(((CommonHeader)input).getCommonHeader());
+
+		// add input to parms
+		LOG.info("Adding INPUT data for "+ rpcName +" input: " + input.toString());
+		Properties inputProps = new Properties();
+		MdsalHelper.toProperties(inputProps, input);
+
+		LOG.info("Printing SLI parameters to be passed");
+
+	// iterate properties file to get key-value pairs
+		for (String key : inputProps.stringPropertyNames()) {
+			String value = inputProps.getProperty(key);
+			LOG.info("The SLI parameter in " + key + " is: " + value);
+		}
+
+		Properties respProps = new Properties();
+
+		// Call SLI sync method
+		try
+		{
+			if (RANSliceClient.hasGraph("ran-slice-api", rpcName , null, "sync"))
+			{
+				try
+				{
+					respProps = RANSliceClient.execute("ran-slice-api", rpcName, null, "sync", inputProps, domDataBroker);
+				}
+				catch (Exception e)
+				{
+					LOG.error("Caught exception executing service logic for "+ rpcName, e);
+					statusBuilder.setCode(RANSliceResponseCode.FAILURE_DG_FAILURE.getValue());
+					statusBuilder.setMessage("FAILURE - DG FAILURE ("+e.getMessage()+")");
+					throw new RANSliceRpcInvocationException(statusBuilder.build(), hBuilder.build());
+				}
+			} else {
+				LOG.error("No service logic active for RANSlice: '" + rpcName + "'");
+
+				statusBuilder.setCode(RANSliceResponseCode.REJECT_DG_NOT_FOUND.getValue());
+				statusBuilder.setMessage("FAILURE - DG not found for action "+rpcName);
+				throw new RANSliceRpcInvocationException(statusBuilder.build(), hBuilder.build());
+			}
+		}
+		catch (Exception e)
+		{
+			LOG.error("Caught exception looking for service logic", e);
+
+			statusBuilder.setCode(RANSliceResponseCode.FAILURE_DG_FAILURE.getValue());
+			statusBuilder.setMessage("FAILURE - Unexpected error looking for DG ("+e.getMessage()+")");
+			throw new RANSliceRpcInvocationException(statusBuilder.build(), hBuilder.build());
+		}
+
+
+		StatusBuilder sBuilder = new StatusBuilder();
+		MdsalHelper.toBuilder(respProps, sBuilder);
+		MdsalHelper.toBuilder(respProps, hBuilder);
+
+		Payload payload = null;
+		String payloadValue = respProps.getProperty("payload");
+		if (payloadValue != null) {
+			payload = new Payload(payloadValue);
+		}
+
+		String statusCode = sBuilder.getCode().toString();
+
+		if (!"400".equals(statusCode)) {
+			LOG.error("Returned FAILED for "+rpcName+" error code: '" + statusCode + "'");
+		} else {
+			LOG.info("Returned SUCCESS for "+rpcName+" ");
+		}
+
+		return new CommonRANSliceFields(sBuilder, hBuilder, payload);
+
+	}
+
+}
diff --git a/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceResponseCode.java b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceResponseCode.java
new file mode 100644
index 0000000..814b27e
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceResponseCode.java
@@ -0,0 +1,51 @@
+package org.onap.ccsdk.features.sdnr.northbound.ranSlice;
+
+public enum RANSliceResponseCode {
+
+		// Accepted category
+		ACCEPT_ACCEPTED(100),
+		// Error category
+		ERROR_UNEXPECTED_ERROR(200),
+		// Rejected category
+		REJECT_REJECTED(300),
+		REJECT_INVALID_INPUT(301),
+		REJECT_MISSING_PARAM(302),
+		REJECT_PARSING_FAILED(303),
+		REJECT_NO_TRANSITION(304),
+		REJECT_ACTION_NOT_SUPPORTED(305),
+		REJECT_VNF_NOT_FOUND(306),
+		REJECT_DG_NOT_FOUND(307),
+		REJECT_WORKFLOW_NOT_FOUND(308),
+		REJECT_UNSTABLE_VNF(309),
+		REJECT_LOCKING_FAILURE(310),
+		REJECT_EXPIRED_REQUEST(311),
+		REJECT_DUPLICATE_REQUEST(312),
+		REJECT_MISSING_AAI_DATA(313),
+		REJECT_MULTIPLE_REQUESTS_FOR_SEARCH(315),
+		REJECT_POLICY_VALIDATION_FAILURE(316),
+		// Success category
+		SUCCESS(400),
+		// Failure category
+		FAILURE_DG_FAILURE(401),
+		FAILURE_NO_TRANSITION(402),
+		FAILURE_AAI_FAILURE(403),
+		FAILURE_EXPIRED_REQUEST(404),
+		FAILURE_UNEXPECTED_FAILURE(405),
+		FAILURE_UNSTABLE_VNF(406),
+		FAILURE_REQUEST_NOT_SUPPORTED(450),
+		// Partial success
+		PARTIAL_SUCCESS(500);
+
+
+
+		private int value;
+		private RANSliceResponseCode(int value) {
+			this.value = value;
+		}
+
+		public int getValue() {
+			return value;
+		}
+
+
+}
diff --git a/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceRpcInvocationException.java b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceRpcInvocationException.java
new file mode 100644
index 0000000..18b6631
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceRpcInvocationException.java
@@ -0,0 +1,25 @@
+package org.onap.ccsdk.features.sdnr.northbound.ranSlice;
+
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.common.header.CommonHeader;
+import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.status.Status;
+
+public class RANSliceRpcInvocationException extends SvcLogicException {
+
+	private Status status;
+	private CommonHeader commonHeader;
+
+	public RANSliceRpcInvocationException(Status status, CommonHeader commonHeader) {
+		this.status = status;
+		this.commonHeader = commonHeader;
+	}
+
+	public Status getStatus() {
+		return status;
+	}
+
+	public CommonHeader getCommonHeader() {
+		return commonHeader;
+	}
+
+}
diff --git a/sdnr/northbound/ranSlice/provider/src/main/resources/OSGI-INF/blueprint/impl-blueprint.xml b/sdnr/northbound/ranSlice/provider/src/main/resources/OSGI-INF/blueprint/impl-blueprint.xml
new file mode 100644
index 0000000..57ebfbf
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/main/resources/OSGI-INF/blueprint/impl-blueprint.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ ============LICENSE_START=======================================================
+  ~ ONAP : ccsdk features
+  ~ ================================================================================
+  ~ Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+  ~ ================================================================================
+  ~ 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.
+  ~ ============LICENSE_END=======================================================
+  ~
+  -->
+
+<blueprint xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
+           xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" odl:use-default-for-reference-types="true">
+
+    <reference id="svcLogicService"
+               interface="org.onap.ccsdk.sli.core.sli.provider.SvcLogicService"/>
+
+    <bean id="client" class="org.onap.ccsdk.features.sdnr.northbound.ranSlice.RANSliceClient">
+        <argument ref="svcLogicService"/>
+    </bean>
+
+    <reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+               odl:type="default"/>
+
+    <reference id="notificationService"
+               interface="org.opendaylight.controller.md.sal.binding.api.NotificationPublishService"
+               odl:type="default"/>
+
+    <reference id="rpcRegistry" interface="org.opendaylight.controller.sal.binding.api.RpcProviderRegistry"
+               odl:type="default"/>
+
+    <bean id="provider" class="org.onap.ccsdk.features.sdnr.northbound.ranSlice.RANSliceProvider">
+        <argument ref="dataBroker"/>
+        <argument ref="rpcRegistry"/>
+        <argument ref="notificationService"/>
+        <argument ref="client"/>
+    </bean>
+
+    <odl:rpc-implementation ref="provider"/>
+
+</blueprint>
diff --git a/sdnr/northbound/ranSlice/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml b/sdnr/northbound/ranSlice/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml
new file mode 100644
index 0000000..57ebfbf
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ ============LICENSE_START=======================================================
+  ~ ONAP : ccsdk features
+  ~ ================================================================================
+  ~ Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+  ~ ================================================================================
+  ~ 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.
+  ~ ============LICENSE_END=======================================================
+  ~
+  -->
+
+<blueprint xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
+           xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" odl:use-default-for-reference-types="true">
+
+    <reference id="svcLogicService"
+               interface="org.onap.ccsdk.sli.core.sli.provider.SvcLogicService"/>
+
+    <bean id="client" class="org.onap.ccsdk.features.sdnr.northbound.ranSlice.RANSliceClient">
+        <argument ref="svcLogicService"/>
+    </bean>
+
+    <reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+               odl:type="default"/>
+
+    <reference id="notificationService"
+               interface="org.opendaylight.controller.md.sal.binding.api.NotificationPublishService"
+               odl:type="default"/>
+
+    <reference id="rpcRegistry" interface="org.opendaylight.controller.sal.binding.api.RpcProviderRegistry"
+               odl:type="default"/>
+
+    <bean id="provider" class="org.onap.ccsdk.features.sdnr.northbound.ranSlice.RANSliceProvider">
+        <argument ref="dataBroker"/>
+        <argument ref="rpcRegistry"/>
+        <argument ref="notificationService"/>
+        <argument ref="client"/>
+    </bean>
+
+    <odl:rpc-implementation ref="provider"/>
+
+</blueprint>
diff --git a/sdnr/northbound/ranSlice/provider/src/test/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceProviderTest.java b/sdnr/northbound/ranSlice/provider/src/test/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceProviderTest.java
new file mode 100644
index 0000000..f1e1524
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceProviderTest.java
@@ -0,0 +1,366 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.ccsdk.features.sdnr.northbound.ranSlice;
+
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Properties;
+import java.util.concurrent.ExecutionException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.ccsdk.sli.core.sli.SvcLogicLoader;
+import org.onap.ccsdk.sli.core.sli.SvcLogicStore;
+import org.onap.ccsdk.sli.core.sli.SvcLogicStoreFactory;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicClassResolver;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicPropertiesProviderImpl;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicServiceImpl;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.*;
+import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.common.header.CommonHeaderBuilder;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RANSliceProviderTest {
+
+  	Logger LOG = LoggerFactory.getLogger(RANSliceProvider.class);
+  	private RANSliceProvider provider;
+
+      /**
+       * @throws java.lang.Exception
+       */
+      @Before
+      public void setUp() throws Exception {
+          DataBroker dataBroker = mock(DataBroker.class);
+          NotificationPublishService notifyService = mock(NotificationPublishService.class);
+          RpcProviderRegistry rpcRegistry = mock(RpcProviderRegistry.class);
+          BindingAwareBroker.RpcRegistration<RanSliceApiService> rpcRegistration = (BindingAwareBroker.RpcRegistration<RanSliceApiService>) mock(BindingAwareBroker.RpcRegistration.class);
+          when(rpcRegistry.addRpcImplementation(any(Class.class), any(RanSliceApiService.class))).thenReturn(rpcRegistration);
+
+
+          // Load svclogic.properties and get a SvcLogicStore
+          InputStream propStr = RANSliceProviderTest.class.getResourceAsStream("/svclogic.properties");
+          Properties svcprops = new Properties();
+          svcprops.load(propStr);
+
+          SvcLogicStore store = SvcLogicStoreFactory.getSvcLogicStore(svcprops);
+
+          assertNotNull(store);
+
+          URL graphUrl = RANSliceProviderTest.class.getClassLoader().getResource("graphs");
+          LOG.info("Graph URL:" + graphUrl);
+
+
+          if (graphUrl == null) {
+              fail("Cannot find graphs directory");
+          }
+
+          SvcLogicLoader loader = new SvcLogicLoader(graphUrl.getPath(), store);
+          loader.loadAndActivate();
+
+          // Create a ServiceLogicService
+          SvcLogicServiceImpl svc = new SvcLogicServiceImpl(new SvcLogicPropertiesProviderImpl(),
+  				new SvcLogicClassResolver());
+
+          // Finally ready to create sliapiProvider
+          RANSliceClient client = new RANSliceClient(svc);
+          provider = new RANSliceProvider(dataBroker, notifyService, rpcRegistry, client);
+      }
+
+      /**
+       * @throws java.lang.Exception
+       */
+      @After
+      public void tearDown() throws Exception {
+          provider.close();
+      }
+
+
+  	@Test
+  	public void testConfigureNearRTRIC() {
+  		ConfigureNearRTRICInputBuilder builder = new ConfigureNearRTRICInputBuilder();
+
+  		CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder();
+  		hdrBuilder.setApiVer("1");
+  		hdrBuilder.setFlags(null);
+  		hdrBuilder.setOriginatorId("jUnit");
+  		hdrBuilder.setRequestId("123");
+  		hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date())));
+  		builder.setCommonHeader(hdrBuilder.build());
+
+  		builder.setAction(Action.Reconfigure);
+
+  		try {
+  			ConfigureNearRTRICOutput results = provider.configureNearRTRIC(builder.build()).get().getResult();
+  			LOG.info("configureNearRTRIC returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage());
+  			assert(results.getStatus().getCode() == 400);
+  		} catch (InterruptedException | ExecutionException e) {
+  			LOG.error("Caught exception", e);
+  			fail("configureNearRTRIC threw exception");
+  		}
+
+  	}
+
+
+    @Test
+  	public void testInstantiateRANSlice() {
+  		InstantiateRANSliceInputBuilder builder = new InstantiateRANSliceInputBuilder();
+
+  		CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder();
+  		hdrBuilder.setApiVer("1");
+  		hdrBuilder.setFlags(null);
+  		hdrBuilder.setOriginatorId("jUnit");
+  		hdrBuilder.setRequestId("123");
+  		hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date())));
+  		builder.setCommonHeader(hdrBuilder.build());
+
+  		builder.setAction(Action.Reconfigure);
+
+  		try {
+  			InstantiateRANSliceOutput results = provider.instantiateRANSlice(builder.build()).get().getResult();
+  			LOG.info("instantiateRANSlice returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage());
+  			assert(results.getStatus().getCode() == 400);
+  		} catch (InterruptedException | ExecutionException e) {
+  			LOG.error("Caught exception", e);
+  			fail("instantiateRANSlice threw exception");
+  		}
+
+  	}
+
+
+    @Test
+  	public void testConfigureRANSliceInstance() {
+  		ConfigureRANSliceInstanceInputBuilder builder = new ConfigureRANSliceInstanceInputBuilder();
+
+  		CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder();
+  		hdrBuilder.setApiVer("1");
+  		hdrBuilder.setFlags(null);
+  		hdrBuilder.setOriginatorId("jUnit");
+  		hdrBuilder.setRequestId("123");
+  		hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date())));
+  		builder.setCommonHeader(hdrBuilder.build());
+
+  		builder.setAction(Action.Reconfigure);
+
+  		try {
+  			ConfigureRANSliceInstanceOutput results = provider.configureRANSliceInstance(builder.build()).get().getResult();
+  			LOG.info("configureRANSliceInstance returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage());
+  			assert(results.getStatus().getCode() == 400);
+  		} catch (InterruptedException | ExecutionException e) {
+  			LOG.error("Caught exception", e);
+  			fail("configureRANSliceInstance threw exception");
+  		}
+
+  	}
+
+    @Test
+  	public void testConfigureCU() {
+  		ConfigureCUInputBuilder builder = new ConfigureCUInputBuilder();
+
+  		CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder();
+  		hdrBuilder.setApiVer("1");
+  		hdrBuilder.setFlags(null);
+  		hdrBuilder.setOriginatorId("jUnit");
+  		hdrBuilder.setRequestId("123");
+  		hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date())));
+  		builder.setCommonHeader(hdrBuilder.build());
+
+  		builder.setAction(Action.Reconfigure);
+
+  		try {
+  			ConfigureCUOutput results = provider.configureCU(builder.build()).get().getResult();
+  			LOG.info("configureCU returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage());
+  			assert(results.getStatus().getCode() == 400);
+  		} catch (InterruptedException | ExecutionException e) {
+  			LOG.error("Caught exception", e);
+  			fail("configureCU threw exception");
+  		}
+
+  	}
+
+
+    @Test
+  	public void testConfigureDU() {
+  		ConfigureDUInputBuilder builder = new ConfigureDUInputBuilder();
+
+  		CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder();
+  		hdrBuilder.setApiVer("1");
+  		hdrBuilder.setFlags(null);
+  		hdrBuilder.setOriginatorId("jUnit");
+  		hdrBuilder.setRequestId("123");
+  		hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date())));
+  		builder.setCommonHeader(hdrBuilder.build());
+
+  		builder.setAction(Action.Reconfigure);
+
+  		try {
+  			ConfigureDUOutput results = provider.configureDU(builder.build()).get().getResult();
+  			LOG.info("configureDU returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage());
+  			assert(results.getStatus().getCode() == 400);
+  		} catch (InterruptedException | ExecutionException e) {
+  			LOG.error("Caught exception", e);
+  			fail("configureDU threw exception");
+  		}
+
+  	}
+
+    @Test
+  	public void testActivateRANSliceInstance() {
+  		ActivateRANSliceInstanceInputBuilder builder = new ActivateRANSliceInstanceInputBuilder();
+
+  		CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder();
+  		hdrBuilder.setApiVer("1");
+  		hdrBuilder.setFlags(null);
+  		hdrBuilder.setOriginatorId("jUnit");
+  		hdrBuilder.setRequestId("123");
+  		hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date())));
+  		builder.setCommonHeader(hdrBuilder.build());
+
+  		builder.setAction(Action.Reconfigure);
+
+  		try {
+  			ActivateRANSliceInstanceOutput results = provider.activateRANSliceInstance(builder.build()).get().getResult();
+  			LOG.info("activateRANSliceInstance returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage());
+  			assert(results.getStatus().getCode() == 400);
+  		} catch (InterruptedException | ExecutionException e) {
+  			LOG.error("Caught exception", e);
+  			fail("activateRANSliceInstance threw exception");
+  		}
+
+  	}
+
+
+    @Test
+  	public void testDeactivateRANSliceInstance() {
+  		DeactivateRANSliceInstanceInputBuilder builder = new DeactivateRANSliceInstanceInputBuilder();
+
+  		CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder();
+  		hdrBuilder.setApiVer("1");
+  		hdrBuilder.setFlags(null);
+  		hdrBuilder.setOriginatorId("jUnit");
+  		hdrBuilder.setRequestId("123");
+  		hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date())));
+  		builder.setCommonHeader(hdrBuilder.build());
+
+  		builder.setAction(Action.Reconfigure);
+
+  		try {
+  			DeactivateRANSliceInstanceOutput results = provider.deactivateRANSliceInstance(builder.build()).get().getResult();
+  			LOG.info("deactivateRANSliceInstance returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage());
+  			assert(results.getStatus().getCode() == 400);
+  		} catch (InterruptedException | ExecutionException e) {
+  			LOG.error("Caught exception", e);
+  			fail("deactivateRANSliceInstance threw exception");
+  		}
+
+  	}
+
+    @Test
+  	public void testTerminateRANSliceInstance() {
+  		TerminateRANSliceInstanceInputBuilder builder = new TerminateRANSliceInstanceInputBuilder();
+
+  		CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder();
+  		hdrBuilder.setApiVer("1");
+  		hdrBuilder.setFlags(null);
+  		hdrBuilder.setOriginatorId("jUnit");
+  		hdrBuilder.setRequestId("123");
+  		hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date())));
+  		builder.setCommonHeader(hdrBuilder.build());
+
+  		builder.setAction(Action.Reconfigure);
+
+  		try {
+  			TerminateRANSliceInstanceOutput results = provider.terminateRANSliceInstance(builder.build()).get().getResult();
+  			LOG.info("terminateRANSliceInstance returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage());
+  			assert(results.getStatus().getCode() == 400);
+  		} catch (InterruptedException | ExecutionException e) {
+  			LOG.error("Caught exception", e);
+  			fail("terminateRANSliceInstance threw exception");
+  		}
+
+  	}
+
+    @Test
+  	public void testDetermineRANSliceResources() {
+  		DetermineRANSliceResourcesInputBuilder builder = new DetermineRANSliceResourcesInputBuilder();
+
+  		CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder();
+  		hdrBuilder.setApiVer("1");
+  		hdrBuilder.setFlags(null);
+  		hdrBuilder.setOriginatorId("jUnit");
+  		hdrBuilder.setRequestId("123");
+  		hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date())));
+  		builder.setCommonHeader(hdrBuilder.build());
+
+  		builder.setAction(Action.Reconfigure);
+
+  		try {
+  			DetermineRANSliceResourcesOutput results = provider.determineRANSliceResources(builder.build()).get().getResult();
+  			LOG.info("determineRANSliceResources returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage());
+  			assert(results.getStatus().getCode() == 400);
+  		} catch (InterruptedException | ExecutionException e) {
+  			LOG.error("Caught exception", e);
+  			fail("determineRANSliceResources threw exception");
+  		}
+
+  	}
+
+
+    @Test
+  	public void testConfigNotification() {
+  		ConfigNotificationInputBuilder builder = new ConfigNotificationInputBuilder();
+
+  		CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder();
+  		hdrBuilder.setApiVer("1");
+  		hdrBuilder.setFlags(null);
+  		hdrBuilder.setOriginatorId("jUnit");
+  		hdrBuilder.setRequestId("123");
+  		hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date())));
+  		builder.setCommonHeader(hdrBuilder.build());
+
+  		builder.setAction(Action.Reconfigure);
+
+  		try {
+  			ConfigNotificationOutput results = provider.configNotification(builder.build()).get().getResult();
+  			LOG.info("configNotification returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage());
+  			assert(results.getStatus().getCode() == 400);
+  		} catch (InterruptedException | ExecutionException e) {
+  			LOG.error("Caught exception", e);
+  			fail("configNotification threw exception");
+  		}
+
+  	}
+
+
+  }
diff --git a/sdnr/northbound/ranSlice/provider/src/test/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/TestRANSliceRpcInvocationException.java b/sdnr/northbound/ranSlice/provider/src/test/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/TestRANSliceRpcInvocationException.java
new file mode 100644
index 0000000..4c32c22
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/TestRANSliceRpcInvocationException.java
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+
+package org.onap.ccsdk.features.sdnr.northbound.ranSlice;
+
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.common.header.CommonHeader;
+import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.status.Status;
+
+
+public class TestRANSliceRpcInvocationException {
+
+    @Test(expected = SvcLogicException.class)
+    public void testRANSliceRpcInvocationException() throws SvcLogicException{
+        Status status = null;
+        CommonHeader commonHeader = null;
+        RANSliceRpcInvocationException exception = new RANSliceRpcInvocationException(status, commonHeader);
+        assert(exception.getStatus() == status);
+        assert(exception.getCommonHeader() == commonHeader);
+        throw exception;
+    }
+}
diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/graph.versions b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/graph.versions
new file mode 100644
index 0000000..e9642a4
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/graph.versions
@@ -0,0 +1,10 @@
+ran-slice-api configureNearRTRIC 1.0.1 sync
+ran-slice-api instantiateRANSlice 1.0.1 sync
+ran-slice-api configureRANSliceInstance 1.0.1 sync
+ran-slice-api configureCU 1.0.1 sync
+ran-slice-api configureDU 1.0.1 sync
+ran-slice-api activateRANSliceInstance 1.0.1 sync
+ran-slice-api deactivateRANSliceInstance 1.0.1 sync
+ran-slice-api terminateRANSliceInstance 1.0.1 sync
+ran-slice-api determineRANSliceResources 1.0.1 sync
+ran-slice-api configNotification 1.0.1 sync
diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_activateRANSliceInstance.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_activateRANSliceInstance.xml
new file mode 100644
index 0000000..b7ab247
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_activateRANSliceInstance.xml
@@ -0,0 +1,30 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights
+  							reserved.
+  ================================================================================
+  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.
+  ============LICENSE_END=========================================================
+  -->
+
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd"
+	module='ran-slice-api' version='1.0.1'>
+	<method rpc='activateRANSliceInstance' mode='sync'>
+		<set>
+			<parameter name='status.code' value='400' />
+			<parameter name='status.message' value='SUCCESS' />
+		</set>
+	</method>
+</service-logic>
diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configNotification.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configNotification.xml
new file mode 100644
index 0000000..bad0530
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configNotification.xml
@@ -0,0 +1,30 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights
+  							reserved.
+  ================================================================================
+  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.
+  ============LICENSE_END=========================================================
+  -->
+
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd"
+	module='ran-slice-api' version='1.0.1'>
+	<method rpc='configNotification' mode='sync'>
+		<set>
+			<parameter name='status.code' value='400' />
+			<parameter name='status.message' value='SUCCESS' />
+		</set>
+	</method>
+</service-logic>
diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureCU.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureCU.xml
new file mode 100644
index 0000000..f1e52ea
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureCU.xml
@@ -0,0 +1,30 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights
+  							reserved.
+  ================================================================================
+  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.
+  ============LICENSE_END=========================================================
+  -->
+
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd"
+	module='ran-slice-api' version='1.0.1'>
+	<method rpc='configureCU' mode='sync'>
+		<set>
+			<parameter name='status.code' value='400' />
+			<parameter name='status.message' value='SUCCESS' />
+		</set>
+	</method>
+</service-logic>
diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureDU.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureDU.xml
new file mode 100644
index 0000000..0973765
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureDU.xml
@@ -0,0 +1,30 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights
+  							reserved.
+  ================================================================================
+  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.
+  ============LICENSE_END=========================================================
+  -->
+
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd"
+	module='ran-slice-api' version='1.0.1'>
+	<method rpc='configureDU' mode='sync'>
+		<set>
+			<parameter name='status.code' value='400' />
+			<parameter name='status.message' value='SUCCESS' />
+		</set>
+	</method>
+</service-logic>
diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureNearRTRIC.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureNearRTRIC.xml
new file mode 100644
index 0000000..eadcf76
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureNearRTRIC.xml
@@ -0,0 +1,30 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights
+  							reserved.
+  ================================================================================
+  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.
+  ============LICENSE_END=========================================================
+  -->
+
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd"
+	module='ran-slice-api' version='1.0.1'>
+	<method rpc='configureNearRTRIC' mode='sync'>
+		<set>
+			<parameter name='status.code' value='400' />
+			<parameter name='status.message' value='SUCCESS' />
+		</set>
+	</method>
+</service-logic>
diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureRANSliceInstance.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureRANSliceInstance.xml
new file mode 100644
index 0000000..08242f4
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureRANSliceInstance.xml
@@ -0,0 +1,30 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights
+  							reserved.
+  ================================================================================
+  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.
+  ============LICENSE_END=========================================================
+  -->
+
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd"
+	module='ran-slice-api' version='1.0.1'>
+	<method rpc='configureRANSliceInstance' mode='sync'>
+		<set>
+			<parameter name='status.code' value='400' />
+			<parameter name='status.message' value='SUCCESS' />
+		</set>
+	</method>
+</service-logic>
diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_deactivateRANSliceInstance.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_deactivateRANSliceInstance.xml
new file mode 100644
index 0000000..e7b5c00
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_deactivateRANSliceInstance.xml
@@ -0,0 +1,30 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights
+  							reserved.
+  ================================================================================
+  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.
+  ============LICENSE_END=========================================================
+  -->
+
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd"
+	module='ran-slice-api' version='1.0.1'>
+	<method rpc='deactivateRANSliceInstance' mode='sync'>
+		<set>
+			<parameter name='status.code' value='400' />
+			<parameter name='status.message' value='SUCCESS' />
+		</set>
+	</method>
+</service-logic>
diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_determineRANSliceResources.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_determineRANSliceResources.xml
new file mode 100644
index 0000000..7b7a697
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_determineRANSliceResources.xml
@@ -0,0 +1,30 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights
+  							reserved.
+  ================================================================================
+  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.
+  ============LICENSE_END=========================================================
+  -->
+
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd"
+	module='ran-slice-api' version='1.0.1'>
+	<method rpc='determineRANSliceResources' mode='sync'>
+		<set>
+			<parameter name='status.code' value='400' />
+			<parameter name='status.message' value='SUCCESS' />
+		</set>
+	</method>
+</service-logic>
diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_instantiateRANSlice.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_instantiateRANSlice.xml
new file mode 100644
index 0000000..71f8655
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_instantiateRANSlice.xml
@@ -0,0 +1,30 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights
+  							reserved.
+  ================================================================================
+  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.
+  ============LICENSE_END=========================================================
+  -->
+
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd"
+	module='ran-slice-api' version='1.0.1'>
+	<method rpc='instantiateRANSlice' mode='sync'>
+		<set>
+			<parameter name='status.code' value='400' />
+			<parameter name='status.message' value='SUCCESS' />
+		</set>
+	</method>
+</service-logic>
diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_terminateRANSliceInstance.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_terminateRANSliceInstance.xml
new file mode 100644
index 0000000..372f3ae
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_terminateRANSliceInstance.xml
@@ -0,0 +1,30 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights
+  							reserved.
+  ================================================================================
+  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.
+  ============LICENSE_END=========================================================
+  -->
+
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd"
+	module='ran-slice-api' version='1.0.1'>
+	<method rpc='terminateRANSliceInstance' mode='sync'>
+		<set>
+			<parameter name='status.code' value='400' />
+			<parameter name='status.message' value='SUCCESS' />
+		</set>
+	</method>
+</service-logic>
diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/simplelogger.properties b/sdnr/northbound/ranSlice/provider/src/test/resources/simplelogger.properties
new file mode 100644
index 0000000..001dfd4
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/resources/simplelogger.properties
@@ -0,0 +1,22 @@
+###
+# ============LICENSE_START=======================================================
+# ONAP : CCSDK
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# 						reserved.
+# ================================================================================
+# 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.
+# ============LICENSE_END=========================================================
+###
+
+org.slf4j.simpleLogger.defaultLogLevel=debug
diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/svclogic.properties b/sdnr/northbound/ranSlice/provider/src/test/resources/svclogic.properties
new file mode 100644
index 0000000..426960f
--- /dev/null
+++ b/sdnr/northbound/ranSlice/provider/src/test/resources/svclogic.properties
@@ -0,0 +1,27 @@
+###
+# ============LICENSE_START=======================================================
+# ONAP : CCSDK
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# 						reserved.
+# ================================================================================
+# 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.
+# ============LICENSE_END=========================================================
+###
+
+org.onap.ccsdk.sli.dbtype = jdbc
+org.onap.ccsdk.sli.jdbc.url=jdbc:derby:memory:sdnctl;create=true
+org.onap.ccsdk.sli.jdbc.driver=org.apache.derby.jdbc.EmbeddedDriver
+org.onap.ccsdk.sli.jdbc.database = sdnctl
+org.onap.ccsdk.sli.jdbc.user = test
+org.onap.ccsdk.sli.jdbc.password = test
