diff --git a/apps/openroadm/service/src/main/java/org/onosproject/openroadm/service/OpenRoadmServiceModelRegistrator.java b/apps/openroadm/service/src/main/java/org/onosproject/openroadm/service/OpenRoadmServiceModelRegistrator.java
new file mode 100644
index 0000000..f5f68b6
--- /dev/null
+++ b/apps/openroadm/service/src/main/java/org/onosproject/openroadm/service/OpenRoadmServiceModelRegistrator.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.openroadm.service;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.felix.scr.annotations.Component;
+import org.onosproject.yang.AbstractYangModelRegistrator;
+import org.onosproject.yang.gen.v1.http.org.openroadm.common.service.types.rev20161014.OrgOpenroadmCommonServiceTypes;
+import org.onosproject.yang.gen.v1.http.org.openroadm.common.types.rev20161014.OrgOpenroadmCommonTypes;
+import org.onosproject.yang.gen.v1.http.org.openroadm.resource.rev20161014.OrgOpenroadmResource;
+import org.onosproject.yang.gen.v1.http.org.openroadm.resource.types.rev20161014.OrgOpenroadmResourceTypes;
+import org.onosproject.yang.gen.v1.http.org.openroadm.routing.constrains.rev20161014.OrgOpenroadmRoutingConstraints;
+import org.onosproject.yang.gen.v1.http.org.openroadm.service.rev20161014.OrgOpenroadmService;
+import org.onosproject.yang.gen.v1.http.org.openroadm.topology.rev20161014.OrgOpenroadmTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.IetfInetTypes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20130715.IetfYangTypes;
+import org.onosproject.yang.model.DefaultYangModuleId;
+import org.onosproject.yang.model.YangModuleId;
+import org.onosproject.yang.runtime.AppModuleInfo;
+import org.onosproject.yang.runtime.DefaultAppModuleInfo;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Component to register the Open ROADM service model and its dependencies.
+ */
+@Component(immediate = true)
+public class OpenRoadmServiceModelRegistrator extends AbstractYangModelRegistrator {
+    public OpenRoadmServiceModelRegistrator() {
+        super(OrgOpenroadmService.class, getAppInfo());
+    }
+
+    private static Map<YangModuleId, AppModuleInfo> getAppInfo() {
+        Map<YangModuleId, AppModuleInfo> appInfo = new HashMap<>();
+        // Dependencies for org-openroadm-service
+        appInfo.put(new DefaultYangModuleId("ietf-yang-types", "2013-07-15"),
+                new DefaultAppModuleInfo(IetfYangTypes.class, null));
+        appInfo.put(new DefaultYangModuleId("org-openroadm-routing-constraints", "2016-10-14"),
+                new DefaultAppModuleInfo(OrgOpenroadmRoutingConstraints.class, null));
+        appInfo.put(new DefaultYangModuleId("org-openroadm-common-types", "2016-10-14"),
+                new DefaultAppModuleInfo(OrgOpenroadmCommonTypes.class, null));
+        appInfo.put(new DefaultYangModuleId("org-openroadm-resource-types", "2016-10-14"),
+                new DefaultAppModuleInfo(OrgOpenroadmResourceTypes.class, null));
+        appInfo.put(new DefaultYangModuleId("org-openroadm-common-service-types", "2016-10-14"),
+                new DefaultAppModuleInfo(OrgOpenroadmCommonServiceTypes.class, null));
+
+        // Dependencies for org-openroadm-common-service-types
+        appInfo.put(new DefaultYangModuleId("ietf-inet-types", "2013-07-15"),
+                new DefaultAppModuleInfo(IetfInetTypes.class, null));
+        appInfo.put(new DefaultYangModuleId("org-openroadm-topology", "2016-10-14"),
+                new DefaultAppModuleInfo(OrgOpenroadmTopology.class, null));
+        appInfo.put(new DefaultYangModuleId("org-openroadm-topology", "2016-10-14"),
+                new DefaultAppModuleInfo(OrgOpenroadmTopology.class, null));
+
+        // Dependency for org-openroadm-topology
+        appInfo.put(new DefaultYangModuleId("org-openroadm-resource", "2016-10-14"),
+                new DefaultAppModuleInfo(OrgOpenroadmResource.class, null));
+
+
+        appInfo.put(new DefaultYangModuleId("org-openroadm-service", "2016-10-14"),
+                new DefaultAppModuleInfo(OrgOpenroadmService.class, null));
+        return ImmutableMap.copyOf(appInfo);
+    }
+}
