diff --git a/compiler/api/pom.xml b/compiler/api/pom.xml
index e2398a6..66aa777 100644
--- a/compiler/api/pom.xml
+++ b/compiler/api/pom.xml
@@ -25,24 +25,14 @@
     </parent>
 
     <artifactId>onos-yang-compiler-api</artifactId>
-    <packaging>jar</packaging>
+    <packaging>bundle</packaging>
     <build>
         <plugins>
             <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <version>3.0.2</version>
-                <configuration>
-                    <skipIfEmpty>true</skipIfEmpty>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>default</id>
-                        <goals>
-                            <goal>test-jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>3.2.0</version>
+                <extensions>true</extensions>
             </plugin>
         </plugins>
     </build>
diff --git a/compiler/api/src/main/java/org/onosproject/yang/DefaultYangModel.java b/compiler/api/src/main/java/org/onosproject/yang/DefaultYangModel.java
deleted file mode 100644
index 18358bc..0000000
--- a/compiler/api/src/main/java/org/onosproject/yang/DefaultYangModel.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * 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.yang;
-
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * Represents default YANG model implementation.
- */
-public class DefaultYangModel implements YangModel {
-
-    private final Map<YangModuleId, YangModule> moduleMap;
-
-    /**
-     * Creates an instance of YANG model.
-     */
-    public DefaultYangModel() {
-        moduleMap = new LinkedHashMap<>();
-    }
-
-    @Override
-    public Set<YangModule> getYangModules() {
-        Set<YangModule> modules = new LinkedHashSet<>();
-        for (Map.Entry<YangModuleId, YangModule> entry : moduleMap.entrySet()) {
-            modules.add(entry.getValue());
-        }
-        return modules;
-    }
-
-    @Override
-    public Set<YangModuleId> getYangModulesId() {
-        Set<YangModuleId> ids = new LinkedHashSet<>();
-        for (Map.Entry<YangModuleId, YangModule> entry : moduleMap.entrySet()) {
-            ids.add(entry.getKey());
-        }
-        return ids;
-    }
-
-    @Override
-    public YangModule getYangModule(YangModuleId id) {
-        return moduleMap.get(id);
-    }
-
-    @Override
-    public void addModule(YangModuleId id, YangModule module) {
-        moduleMap.put(id, module);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(moduleMap);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == null) {
-            return false;
-        }
-        DefaultYangModel that = (DefaultYangModel) obj;
-
-        if (moduleMap.size() == that.moduleMap.size()) {
-            for (Map.Entry<YangModuleId, YangModule> entry : moduleMap.entrySet()) {
-                if (!that.moduleMap.containsKey(entry.getKey()) ||
-                        !that.moduleMap.containsValue(entry.getValue())) {
-                    return false;
-                }
-            }
-        } else {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(getClass())
-                .add("model", moduleMap)
-                .toString();
-    }
-}
diff --git a/compiler/api/src/main/java/org/onosproject/yang/DefaultYangModule.java b/compiler/api/src/main/java/org/onosproject/yang/DefaultYangModule.java
deleted file mode 100644
index 3ccbd9c..0000000
--- a/compiler/api/src/main/java/org/onosproject/yang/DefaultYangModule.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * 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.yang;
-
-import org.onosproject.yang.compiler.api.YangCompilerException;
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.nio.file.Path;
-import java.util.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Represents default YANG module.
- */
-public class DefaultYangModule implements YangModule {
-
-    private YangModuleId id;
-    private Path yangSrc;
-    private Path metadata;
-
-    /**
-     * Creates an instance of default YANG module.
-     *
-     * @param id       YANG module id
-     * @param yangSrc  YANG source file path
-     * @param metadata YANG metadata source file path
-     */
-    public DefaultYangModule(YangModuleId id, Path yangSrc, Path metadata) {
-        checkNotNull(yangSrc);
-        checkNotNull(metadata);
-        checkNotNull(id);
-        this.id = id;
-        this.yangSrc = yangSrc;
-        this.metadata = metadata;
-    }
-
-    @Override
-    public YangModuleId getYangModuleId() {
-        return id;
-    }
-
-    @Override
-    public InputStream getYangSource() {
-        try {
-            return new FileInputStream(yangSrc.toString());
-        } catch (FileNotFoundException e) {
-            throw new YangCompilerException("Yang source file not found." +
-                                                    yangSrc);
-        }
-    }
-
-    @Override
-    public InputStream getMetadata() {
-        try {
-            return new FileInputStream(metadata.toString());
-        } catch (FileNotFoundException e) {
-            throw new YangCompilerException("metadata source file not found." +
-                                                    metadata);
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(id, yangSrc, metadata);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == null) {
-            return false;
-        }
-
-        DefaultYangModule that = (DefaultYangModule) obj;
-        return Objects.equals(id, that.id) &&
-                Objects.equals(yangSrc, that.yangSrc) &&
-                Objects.equals(metadata, that.metadata);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(getClass())
-                .add("moduleId", id)
-                .add("yangSource", yangSrc)
-                .add("yangMetadata", metadata)
-                .toString();
-    }
-}
diff --git a/compiler/api/src/main/java/org/onosproject/yang/DefaultYangModuleId.java b/compiler/api/src/main/java/org/onosproject/yang/DefaultYangModuleId.java
deleted file mode 100644
index 2159990..0000000
--- a/compiler/api/src/main/java/org/onosproject/yang/DefaultYangModuleId.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.yang;
-
-import java.util.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Represents default YANG module identifier.
- */
-public class DefaultYangModuleId implements YangModuleId {
-
-    private String moduleName;
-    private String revision;
-
-    /**
-     * Creates an instance of default YANG module id.
-     *
-     * @param name name of module
-     * @param rev  revision of module
-     */
-    public DefaultYangModuleId(String name, String rev) {
-        checkNotNull(name);
-        moduleName = name;
-        revision = rev;
-    }
-
-    @Override
-    public String moduleName() {
-        return moduleName;
-    }
-
-    @Override
-    public String revision() {
-        return revision;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(moduleName, revision);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == null) {
-            return false;
-        }
-
-        DefaultYangModuleId that = (DefaultYangModuleId) obj;
-        return Objects.equals(moduleName, that.moduleName) &&
-                Objects.equals(revision, that.revision);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(getClass())
-                .add("moduleName", moduleName)
-                .add("revision", revision)
-                .toString();
-    }
-}
diff --git a/compiler/api/src/main/java/org/onosproject/yang/YangModel.java b/compiler/api/src/main/java/org/onosproject/yang/YangModel.java
deleted file mode 100644
index fb45c27..0000000
--- a/compiler/api/src/main/java/org/onosproject/yang/YangModel.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2016-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.yang;
-
-import java.util.Set;
-
-/**
- * Representation of a compiled YANG model.
- */
-public interface YangModel {
-
-    /**
-     * Returns set of YANG module with information.
-     *
-     * @return YANG module info
-     */
-    Set<YangModule> getYangModules();
-
-    /**
-     * Returns set of YANG modules identifier.
-     *
-     * @return YANG module identifier
-     */
-    Set<YangModuleId> getYangModulesId();
-
-    /**
-     * Returns YANG module information corresponding to a given module
-     * identifier.
-     *
-     * @param id module identifier
-     * @return YANG module information
-     */
-    YangModule getYangModule(YangModuleId id);
-
-    /**
-     * Adds YANG module information for a given module identifier.
-     *
-     * @param id     module identifier
-     * @param module YANG module information
-     */
-    void addModule(YangModuleId id, YangModule module);
-}
diff --git a/compiler/api/src/main/java/org/onosproject/yang/YangModule.java b/compiler/api/src/main/java/org/onosproject/yang/YangModule.java
deleted file mode 100644
index 9b170fa..0000000
--- a/compiler/api/src/main/java/org/onosproject/yang/YangModule.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2016-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.yang;
-
-import java.io.InputStream;
-
-/**
- * Representation of YANG module information.
- */
-public interface YangModule {
-
-    /**
-     * Returns YANG module identifier.
-     *
-     * @return module identifier
-     */
-    YangModuleId getYangModuleId();
-
-    /**
-     * Returns input stream corresponding to a given YANG file path.
-     *
-     * @return stream
-     */
-    InputStream getYangSource();
-
-    /**
-     * Returns metadata stream.
-     *
-     * @return stream
-     */
-    InputStream getMetadata();
-}
diff --git a/compiler/api/src/main/java/org/onosproject/yang/YangModuleId.java b/compiler/api/src/main/java/org/onosproject/yang/YangModuleId.java
deleted file mode 100644
index 44872df..0000000
--- a/compiler/api/src/main/java/org/onosproject/yang/YangModuleId.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2016-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.yang;
-
-/**
- * Representation of an entity which provides YANG module identifiers.
- * Reference RFC 7895.
- */
-public interface YangModuleId {
-
-    /**
-     * Returns the name of the YANG module.
-     *
-     * @return name of the YANG module
-     */
-    String moduleName();
-
-    /**
-     * Returns revision of the YANG module.
-     * <p>
-     * Reference RFC 7895
-     * Each YANG module and submodule within the library has a
-     * revision. This is derived from the most recent revision statement
-     * within the module or submodule.  If no such revision statement
-     * exists, the module's or submodule's revision is the zero-length
-     * string.
-     *
-     * @return revision of the YANG module
-     */
-    String revision();
-}
diff --git a/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompiledOutput.java b/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompiledOutput.java
index 4caedb8..a75fa34 100644
--- a/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompiledOutput.java
+++ b/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompiledOutput.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.yang.compiler.api;
 
-import org.onosproject.yang.YangModel;
+import org.onosproject.yang.model.YangModel;
 
 import java.nio.file.Path;
 import java.util.Set;
diff --git a/compiler/api/src/main/java/org/onosproject/yang/compiler/api/package-info.java b/compiler/api/src/main/java/org/onosproject/yang/compiler/api/package-info.java
index 7b88263..072f59b 100644
--- a/compiler/api/src/main/java/org/onosproject/yang/compiler/api/package-info.java
+++ b/compiler/api/src/main/java/org/onosproject/yang/compiler/api/package-info.java
@@ -15,6 +15,6 @@
  */
 
 /**
- * Created by root1 on 10/1/17.
+ * Representation of a compiled YANG model.
  */
 package org.onosproject.yang.compiler.api;
\ No newline at end of file
