diff --git a/apps/yang/web/src/main/java/org/onosproject/yang/web/YangWebResource.java b/apps/yang/web/src/main/java/org/onosproject/yang/web/YangWebResource.java
index 9e56f4a..d293b32 100644
--- a/apps/yang/web/src/main/java/org/onosproject/yang/web/YangWebResource.java
+++ b/apps/yang/web/src/main/java/org/onosproject/yang/web/YangWebResource.java
@@ -16,23 +16,10 @@
 
 package org.onosproject.yang.web;
 
-import org.apache.commons.io.IOUtils;
-import org.glassfish.jersey.media.multipart.FormDataBodyPart;
-import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
-import org.glassfish.jersey.media.multipart.FormDataMultiPart;
 import org.glassfish.jersey.media.multipart.FormDataParam;
 import org.onosproject.app.ApplicationAdminService;
 import org.onosproject.rest.AbstractWebResource;
 import org.onosproject.yang.YangLiveCompilerService;
-import org.onosproject.yang.compiler.api.YangCompilationParam;
-import org.onosproject.yang.compiler.api.YangCompilerService;
-import org.onosproject.yang.compiler.datamodel.YangNode;
-import org.onosproject.yang.compiler.tool.DefaultYangCompilationParam;
-import org.onosproject.yang.compiler.tool.YangCompilerManager;
-import org.onosproject.yang.model.YangModel;
-import org.onosproject.yang.runtime.DefaultModelRegistrationParam;
-import org.onosproject.yang.runtime.ModelRegistrationParam;
-import org.onosproject.yang.runtime.YangModelRegistry;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DefaultValue;
@@ -41,22 +28,8 @@
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.file.Paths;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import static org.onosproject.yang.compiler.tool.YangCompilerManager.deSerializeDataModel;
-import static org.onosproject.yang.compiler.tool.YangCompilerManager.processYangModel;
-import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.deleteDirectory;
 
 /**
  * Yang files upload resource.
@@ -80,7 +53,7 @@
      * Compiles and registers the given yang files.
      *
      * @param modelId model identifier
-     * @param stream YANG, ZIP or JAR file
+     * @param stream  YANG, ZIP or JAR file
      * @return 200 OK
      * @throws IOException when fails to generate a file
      */
@@ -94,165 +67,4 @@
         appService.activate(appService.getId(modelId));
         return Response.ok().build();
     }
-
-    /**
-     * Compiles and registers the given yang files.
-     *
-     * @param formData YANG files or ser files
-     * @return 200 OK
-     * @throws IOException when fails to generate a file
-     */
-    @POST
-    @Path("deprecated")
-    @Consumes(MediaType.MULTIPART_FORM_DATA)
-    public Response upload(FormDataMultiPart formData) throws IOException {
-        Map<String, List<File>> input = parseInputData(formData);
-
-        for (Map.Entry<String, List<File>> entry : input.entrySet()) {
-            deleteDirectory(CODE_GEN_DIR);
-            deleteDirectory(YANG_RESOURCES);
-
-            YangCompilerService liveCompiler = get(YangCompilerService.class);
-            liveCompiler.compileYangFiles(createCompilationParam(
-                    entry.getValue()));
-
-            YangModelRegistry modelRegistry = get(YangModelRegistry.class);
-            String key = entry.getKey();
-            if (key.equalsIgnoreCase(REGISTER)) {
-                modelRegistry.registerModel(getModelRegParam());
-            } else if (key.equalsIgnoreCase(UNREGISTER)) {
-                modelRegistry.unregisterModel(getModelRegParam());
-            } else {
-                return Response.serverError().entity(UNKNOWN_KEY).build();
-            }
-        }
-
-        // TODO : create bundles
-
-        return Response.status(200).build();
-    }
-
-    private File getInputFile(InputStream stream, String fileName)
-            throws IOException {
-        byte[] content = IOUtils.toByteArray(stream);
-        File file = new File(fileName);
-        if (!file.exists()) {
-            file.createNewFile();
-        }
-        FileOutputStream fop = new FileOutputStream(file);
-        fop.write(content);
-        fop.flush();
-        fop.close();
-        return file;
-    }
-
-    private Map<String, List<File>> parseInputData(FormDataMultiPart formData)
-            throws IOException {
-        Map<String, List<File>> input = new HashMap<>();
-        Map<String, List<FormDataBodyPart>> fieldsByName = formData.getFields();
-        for (Map.Entry<String, List<FormDataBodyPart>> entry :
-                fieldsByName.entrySet()) {
-            List<File> inputFiles = new LinkedList<>();
-            for (FormDataBodyPart field : entry.getValue()) {
-                InputStream stream = field.getEntityAs(InputStream.class);
-                FormDataContentDisposition content = field
-                        .getFormDataContentDisposition();
-                String fileName = content.getFileName();
-                inputFiles.add(getInputFile(stream, fileName));
-            }
-            input.put(entry.getKey(), inputFiles);
-        }
-        return input;
-    }
-
-    private YangCompilationParam createCompilationParam(List<File> inputFiles)
-            throws IOException {
-        DefaultYangCompilationParam.Builder builder = DefaultYangCompilationParam.builder();
-        for (File file : inputFiles) {
-            if (file.getName().endsWith(JAR_FILE_EXTENSION)
-                    || file.getName().endsWith(ZIP_FILE_EXTENSION)) {
-                List<File> files = decompressFile(file);
-
-                for (File f : files) {
-                    addToParam(builder, f);
-                }
-            } else {
-                addToParam(builder, file);
-            }
-        }
-        builder.setCodeGenDir(Paths.get(CODE_GEN_DIR));
-        builder.setMetadataGenDir(Paths.get(YANG_RESOURCES));
-        return builder.build();
-    }
-
-    private void addToParam(DefaultYangCompilationParam.Builder builder,
-                            File file) {
-        if (file.getName().endsWith(YANG_FILE_EXTENSION)) {
-            builder.addYangFile(Paths.get(file.getAbsolutePath()));
-        } else if (file.getName().endsWith(SER_FILE_EXTENSION)) {
-            builder.addDependentSchema(Paths.get(file.getAbsolutePath()));
-        }
-    }
-
-    private ModelRegistrationParam getModelRegParam() throws IOException {
-        String metaPath = YANG_RESOURCES + SERIALIZED_FILE_NAME;
-        List<YangNode> curNodes = getYangNodes(metaPath);
-        // FIXME: extract or derive the model id from the web request
-        String modelId = "unknown";
-        if (curNodes != null && !curNodes.isEmpty()) {
-            YangModel model = processYangModel(metaPath, curNodes, modelId, false);
-            return DefaultModelRegistrationParam.builder()
-                    .setYangModel(model).build();
-        }
-        return null;
-    }
-
-    private List<YangNode> getYangNodes(String path) throws IOException {
-        List<YangNode> nodes = new LinkedList<>();
-        File file = new File(path);
-        if (file.getName().endsWith(SER_FILE_EXTENSION)) {
-            nodes.addAll(YangCompilerManager.getYangNodes(deSerializeDataModel(file.toString())));
-        }
-        return nodes;
-    }
-
-    private static List<File> decompressFile(File jarFile)
-            throws IOException {
-        ZipFile zip = new ZipFile(jarFile);
-        final List<File> unzipedFiles = new LinkedList<>();
-
-        // first get all directories,
-        // then make those directory on the destination Path
-        for (Enumeration<? extends ZipEntry> enums = zip.entries(); enums.hasMoreElements();) {
-            ZipEntry entry = enums.nextElement();
-
-            String fileName = YANG_RESOURCES + entry.getName();
-            File f = new File(fileName);
-
-            if (fileName.endsWith(SLASH)) {
-                f.mkdirs();
-            }
-        }
-
-        //now create all files
-        for (Enumeration<? extends ZipEntry> enums = zip.entries(); enums.hasMoreElements();) {
-            ZipEntry entry = enums.nextElement();
-            String fileName = YANG_RESOURCES + entry.getName();
-            File f = new File(fileName);
-
-            if (!fileName.endsWith(SLASH)) {
-                InputStream is = zip.getInputStream(entry);
-                FileOutputStream fos = new FileOutputStream(f);
-
-                // write contents of 'is' to 'fos'
-                while (is.available() > 0) {
-                    fos.write(is.read());
-                }
-                unzipedFiles.add(f);
-                fos.close();
-                is.close();
-            }
-        }
-        return unzipedFiles;
-    }
 }
