diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/exception/NcmpStartUpException.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/exception/NcmpStartUpException.java
new file mode 100644
index 0000000..7ac26f5
--- /dev/null
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/exception/NcmpStartUpException.java
@@ -0,0 +1,37 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2023 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.cps.ncmp.api.impl.exception;
+
+/**
+ * NCMP start up exception.
+ */
+public class NcmpStartUpException extends NcmpException {
+
+    /**
+     * Constructor.
+     *
+     * @param message the error message
+     * @param details the error details
+     */
+    public NcmpStartUpException(final String message, final String details) {
+        super(message, details);
+    }
+}
\ No newline at end of file
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/ModelLoader.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/ModelLoader.java
new file mode 100644
index 0000000..6f834b7
--- /dev/null
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/ModelLoader.java
@@ -0,0 +1,52 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2023 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.cps.ncmp.init;
+
+import java.util.Map;
+import lombok.NonNull;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.ApplicationListener;
+
+public interface ModelLoader extends ApplicationListener<ApplicationReadyEvent> {
+
+    @Override
+    void onApplicationEvent(@NonNull ApplicationReadyEvent applicationReadyEvent);
+
+    /**
+     * Create schema set.
+     *
+     * @param dataspaceName dataspace name
+     * @param schemaSetName schemaset name
+     * @param yangResourceContentMap yang resource content map
+     * @return true if schema set is created
+     */
+    boolean createSchemaSet(String dataspaceName, String schemaSetName, Map<String, String> yangResourceContentMap);
+
+    /**
+     * Create anchor.
+     *
+     * @param dataspaceName dataspace name
+     * @param schemaSetName schemaset name
+     * @param anchorName anchor name
+     * @return true if anchor is created
+     */
+    boolean createAnchor(String dataspaceName, String schemaSetName, String anchorName);
+}
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/SubscriptionModelLoader.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/SubscriptionModelLoader.java
new file mode 100644
index 0000000..6713491
--- /dev/null
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/SubscriptionModelLoader.java
@@ -0,0 +1,124 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2023 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.cps.ncmp.init;
+
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.onap.cps.api.CpsAdminService;
+import org.onap.cps.api.CpsModuleService;
+import org.onap.cps.ncmp.api.impl.exception.NcmpStartUpException;
+import org.onap.cps.spi.exceptions.AlreadyDefinedException;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class SubscriptionModelLoader implements ModelLoader {
+
+    private final CpsAdminService cpsAdminService;
+    private final CpsModuleService cpsModuleService;
+    private static final String SUBSCRIPTION_DATASPACE_NAME = "NCMP-Admin";
+    private static final String SUBSCRIPTION_ANCHOR_NAME = "AVC-Subscriptions";
+    private static final String SUBSCRIPTION_SCHEMASET_NAME = "subscriptions";
+
+    /**
+     * Method calls boarding subscription model when Application is ready.
+     *
+     * @param applicationReadyEvent the event to respond to
+     */
+    @Override
+    public void onApplicationEvent(@NonNull final ApplicationReadyEvent applicationReadyEvent) {
+        try {
+            onboardSubscriptionModel();
+        } catch (final NcmpStartUpException ncmpStartUpException) {
+            log.debug("Onboarding model for NCMP failed: {} ", ncmpStartUpException.getMessage());
+            SpringApplication.exit(applicationReadyEvent.getApplicationContext(), () -> 1);
+        }
+    }
+
+    /**
+     * Method to onboard subscription model for NCMP.
+     */
+    private void onboardSubscriptionModel() {
+        final Map<String, String> yangResourceContentMap = createYangResourceToContentMap();
+        if (!yangResourceContentMap.get("subscription.yang").isEmpty()) {
+            createSchemaSet(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME, yangResourceContentMap);
+            createAnchor(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME, SUBSCRIPTION_ANCHOR_NAME);
+        }
+    }
+
+
+    @Override
+    public boolean createSchemaSet(final String dataspaceName,
+                                final String schemaSetName,
+                                final Map<String, String> yangResourceContentMap) {
+        try {
+            cpsModuleService.createSchemaSet(dataspaceName, schemaSetName, yangResourceContentMap);
+        } catch (final AlreadyDefinedException exception) {
+            log.info("Creating new schema set failed as schema set already exists");
+        } catch (final Exception exception) {
+            log.debug("Creating schema set for subscription model failed: {} ", exception.getMessage());
+            throw new NcmpStartUpException("Creating schema set failed", exception.getMessage());
+        }
+        return true;
+    }
+
+    /**
+     * Create Anchor.
+     *
+     * @param dataspaceName dataspace name
+     * @param schemaSetName schema set name
+     * @param anchorName anchor name
+     */
+    @Override
+    public boolean createAnchor(final String dataspaceName, final String schemaSetName,
+                             final String anchorName) {
+        try {
+            cpsAdminService.createAnchor(dataspaceName, schemaSetName, anchorName);
+        } catch (final AlreadyDefinedException exception) {
+            log.info("Creating new anchor failed as anchor already exists");
+        } catch (final Exception exception) {
+            log.debug("Creating anchor for subscription model failed: {} ", exception.getMessage());
+            throw new NcmpStartUpException("Creating anchor failed", exception.getMessage());
+        }
+        return true;
+    }
+
+    private String getFileContentAsString() {
+        try (InputStream inputStream = ClassLoader.getSystemClassLoader()
+                .getResourceAsStream("model/subscription.yang")) {
+            return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
+        } catch (final Exception exception) {
+            log.debug("Onboarding failed as unable to read file: {}", exception.getCause().toString());
+            throw new NcmpStartUpException("Onboarding failed as unable to read file: {}", exception.getMessage());
+        }
+    }
+
+    private Map<String, String> createYangResourceToContentMap() {
+        return Map.of("subscription.yang", getFileContentAsString());
+    }
+}
diff --git a/cps-ncmp-service/src/main/resources/model/subscription.yang b/cps-ncmp-service/src/main/resources/model/subscription.yang
index c5dee43..ad35844 100644
--- a/cps-ncmp-service/src/main/resources/model/subscription.yang
+++ b/cps-ncmp-service/src/main/resources/model/subscription.yang
@@ -28,6 +28,11 @@
             leaf isTagged {
                 type boolean;
             }
+
+            leaf-list dmi-service-names {
+                type string;
+            }
+
         }
     }
 }
\ No newline at end of file
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/SubscriptionModelLoaderSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/SubscriptionModelLoaderSpec.groovy
new file mode 100644
index 0000000..65c0497
--- /dev/null
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/SubscriptionModelLoaderSpec.groovy
@@ -0,0 +1,145 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2023 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.cps.ncmp.init
+
+import ch.qos.logback.classic.Level
+import ch.qos.logback.classic.Logger
+import ch.qos.logback.core.read.ListAppender
+import org.junit.jupiter.api.AfterEach
+import org.junit.jupiter.api.BeforeEach
+import org.onap.cps.api.CpsAdminService
+import org.onap.cps.api.CpsModuleService
+import org.onap.cps.ncmp.api.impl.exception.NcmpStartUpException
+import org.onap.cps.spi.exceptions.AlreadyDefinedException
+import org.onap.cps.spi.exceptions.SchemaSetNotFoundException
+import org.springframework.boot.SpringApplication
+import org.slf4j.LoggerFactory
+import org.springframework.boot.context.event.ApplicationReadyEvent
+import spock.lang.Specification
+
+class SubscriptionModelLoaderSpec extends Specification {
+
+    def mockCpsAdminService = Mock(CpsAdminService)
+    def mockCpsModuleService = Mock(CpsModuleService)
+    def objectUnderTest = new SubscriptionModelLoader(mockCpsAdminService, mockCpsModuleService)
+
+    def SUBSCRIPTION_DATASPACE_NAME = objectUnderTest.SUBSCRIPTION_DATASPACE_NAME;
+    def SUBSCRIPTION_ANCHOR_NAME = objectUnderTest.SUBSCRIPTION_ANCHOR_NAME;
+    def SUBSCRIPTION_SCHEMASET_NAME = objectUnderTest.SUBSCRIPTION_SCHEMASET_NAME;
+
+    def sampleYangContentMap = ['subscription.yang':'module subscription { *sample content* }']
+
+    def applicationReadyEvent = new ApplicationReadyEvent(new SpringApplication(), null, null, null)
+
+    def logger
+    def appender
+
+    @BeforeEach
+    void setup() {
+        logger = (Logger) LoggerFactory.getLogger(objectUnderTest.getClass())
+        appender = new ListAppender()
+        logger.setLevel(Level.DEBUG)
+        appender.start()
+        logger.addAppender(appender)
+    }
+
+    @AfterEach
+    void teardown() {
+        ((Logger) LoggerFactory.getLogger(SubscriptionModelLoader.class)).detachAndStopAllAppenders();
+    }
+
+    def 'Onboard subscription model successfully via application ready event'() {
+        when: 'the application is ready'
+            objectUnderTest.onApplicationEvent(applicationReadyEvent)
+        then: 'the module service to create schema set is called once'
+            1 * mockCpsModuleService.createSchemaSet(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME,sampleYangContentMap)
+        and: 'the admin service to create an anchor set is called once'
+            1 * mockCpsAdminService.createAnchor(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME, SUBSCRIPTION_ANCHOR_NAME)
+    }
+
+    def 'Create schema set from model file'() {
+        given: 'the method to create yang resource to content map returns the correct map'
+            def yangResourceToContentMap = objectUnderTest.createYangResourceToContentMap()
+        when: 'the method to create schema set is called with the following parameters'
+            objectUnderTest.createSchemaSet("myDataspace", "mySchemaSet", yangResourceToContentMap)
+        then: 'yang resource to content map is as expected'
+            assert sampleYangContentMap == yangResourceToContentMap
+        and: 'the module service to create schema set is called once with the correct map'
+            1 * mockCpsModuleService.createSchemaSet(_, _, yangResourceToContentMap)
+    }
+
+    def 'Create schema set fails due to AlreadyDefined exception'() {
+        given: 'the method to create yang resource to content map returns the correct map'
+            def yangResourceToContentMap = objectUnderTest.createYangResourceToContentMap()
+        and: 'creating a schema set throws an exception as it already exists'
+            mockCpsModuleService.createSchemaSet(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME, yangResourceToContentMap) >>
+                    { throw AlreadyDefinedException.forSchemaSet(SUBSCRIPTION_SCHEMASET_NAME, "sampleContextName", null) }
+        when: 'the method to onboard model is called'
+            objectUnderTest.onboardSubscriptionModel()
+        then: 'the admin service to create an anchor set is then called once'
+            1 * mockCpsAdminService.createAnchor(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME, SUBSCRIPTION_ANCHOR_NAME)
+    }
+
+    def 'Create schema set fails due to any other exception'() {
+        given: 'the method to create yang resource to content map returns the correct map'
+            def yangResourceToContentMap = objectUnderTest.createYangResourceToContentMap()
+        and: 'creating a schema set throws an exception'
+            mockCpsModuleService.createSchemaSet(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME, yangResourceToContentMap) >>
+                    { throw new NcmpStartUpException("Creating schema set failed", ""); }
+        when: 'the method to onboard model is called'
+            objectUnderTest.onboardSubscriptionModel()
+        then: 'the log message contains the correct exception message'
+            def debugMessage = appender.list[0].toString()
+            assert debugMessage.contains("Creating schema set failed")
+        and: 'exception is thrown'
+            thrown(NcmpStartUpException)
+    }
+
+    def 'Create anchor fails due to AlreadyDefined exception'() {
+        given: 'creating anchor throws an exception as it already exists'
+            mockCpsAdminService.createAnchor(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME, SUBSCRIPTION_ANCHOR_NAME) >>
+                    { throw AlreadyDefinedException.forSchemaSet(SUBSCRIPTION_SCHEMASET_NAME, "sampleContextName", null) }
+        when: 'the method to onboard model is called'
+            objectUnderTest.onboardSubscriptionModel()
+        then: 'no exception thrown'
+            noExceptionThrown()
+    }
+
+    def 'Create anchor fails due to any other exception'() {
+        given: 'creating an anchor failed'
+            mockCpsAdminService.createAnchor(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME, SUBSCRIPTION_ANCHOR_NAME) >>
+                    { throw new SchemaSetNotFoundException(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_SCHEMASET_NAME) }
+        when: 'the method to onboard model is called'
+            objectUnderTest.onboardSubscriptionModel()
+        then: 'the log message contains the correct exception message'
+            def debugMessage = appender.list[0].toString()
+            assert debugMessage.contains("Schema Set not found")
+        and: 'exception is thrown'
+            thrown(NcmpStartUpException)
+    }
+
+    def 'Get file content as string'() {
+        when: 'the method to get yang content is called'
+            def response = objectUnderTest.getFileContentAsString()
+        then: 'the response is as expected'
+            assert response == 'module subscription { *sample content* }'
+    }
+}
\ No newline at end of file
diff --git a/cps-ncmp-service/src/test/resources/model/subscription.yang b/cps-ncmp-service/src/test/resources/model/subscription.yang
new file mode 100644
index 0000000..a575857
--- /dev/null
+++ b/cps-ncmp-service/src/test/resources/model/subscription.yang
@@ -0,0 +1 @@
+module subscription { *sample content* }
\ No newline at end of file
