diff --git a/static/src/instancehandler/instance_create.js b/static/src/instancehandler/instance_create.js
new file mode 100644
index 0000000..55fb512
--- /dev/null
+++ b/static/src/instancehandler/instance_create.js
@@ -0,0 +1,66 @@
+/*
+   Copyright 2018 CNIT - Consorzio Nazionale Interuniversitario per le Telecomunicazioni
+
+   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  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.
+*/
+
+
+function openModalCreateNS(args) {
+
+    // load vim account list
+    select2_groups = $('#vimAccountId').select2({
+        placeholder: 'Select VIM',
+        ajax: {
+            url: args.vim_list_url,
+            dataType: 'json',
+            processResults: function (data) {
+                vims = [];
+                if (data['datacenters']) {
+                    for (d in data['datacenters']) {
+                        var datacenter = data['datacenters'][d];
+                        vims.push({id: datacenter['_id'], text: datacenter['name']})
+                    }
+                }
+
+                return {
+                    results: vims
+                };
+            }
+        }
+    });
+    /*
+    // load nsd list
+    select2_groups = $('#nsdId').select2({
+        placeholder: 'Select NSD',
+        ajax: {
+            url: args.nsd_list_url,
+            dataType: 'json',
+            processResults: function (data) {
+                nsd_list = [];
+                if (data['nsd_list']) {
+                    for (d in data['nsd_list']) {
+                        var nsd = data['nsd_list'][d];
+                        nsd_list.push({id: nsd['_id'], text: nsd['name']})
+                    }
+                }
+
+                return {
+                    results: nsd_list
+                };
+            }
+        }
+    });
+    */
+    $('#nsdId').val(args.descriptor_id);
+    $('#modal_new_instance').modal('show');
+}
\ No newline at end of file
diff --git a/static/src/projecthandler/descriptorslist.js b/static/src/projecthandler/descriptorslist.js
index 4a5975a..5a803da 100644
--- a/static/src/projecthandler/descriptorslist.js
+++ b/static/src/projecthandler/descriptorslist.js
@@ -1,69 +1,42 @@
-
-function startFromAgent(start) {
+ function deletePackage(project_id, descriptor_type, package_id) {
+            bootbox.confirm("Are you sure want to delete?", function (result) {
+                if (result) {
+                    location.href = '/projects/' + project_id + '/descriptors/' + descriptor_type + '/' + package_id + '/delete'
+                }
+            })
+        }
 
 
-    if (start == 'exist'){
-        $('#div_new_agent').hide();
-        $('#div_available_agent').show();
-    }
-    else if (start == 'new'){
-        $('#div_available_agent').hide();
-        $('#div_new_agent').show();
-    }
 
-    $('.required').prop('required', function(){
-        return  $(this).is(':visible');
-    });
-
-}
-/*
-function InvalidGitUrl(textbox) {
-    console.log('InvalidGitUrl', textbox,textbox.value == '' ,textbox.validity.typeMismatch)
-    if (textbox.value === '') {
-        textbox.setCustomValidity('Required git URL');
-    }
-    else if (textbox.validity.typeMismatch){
-        textbox.setCustomValidity('please enter a valid git URL');
-
-    }
-    else {
-        textbox.setCustomValidity('please enter a valid git URL');
-    }
-    return true;
-}
-*/
-function startFromRepo(start) {
+        function openPackageContentList(project_id, type, pkg_id) {
+            var dialog = bootbox.dialog({
+                message: '<div class="text-center"><i class="fa fa-spin fa-spinner"></i> Loading...</div>',
+                closeButton: true
+            });
+            $.ajax({
+                url: '/projects/' + project_id + '/descriptors/' + type + '/' + pkg_id + '/action/get_package_files_list',
+                type: 'GET',
+                dataType: "json",
+                contentType: "application/json;charset=utf-8",
+                success: function (result) {
+                    //$('#modal_show_vim_body').empty();
+                    dialog.modal('hide');
+                    build_file_list("Files in " + pkg_id, result.files);
+                },
+                error: function (result) {
+                    dialog.modal('hide');
+                    bootbox.alert("An error occurred while retrieving the package content.");
+                }
+            });
+        }
 
 
-    if (start == 'exist'){
-        $('#div_new_repo').hide();
-        $('#div_available_repo').show();
-    }
-    else if (start == 'new'){
-        $('#div_available_repo').hide();
-        $('#div_new_repo').show();
-    }
-
-    $('.required').prop('required', function(){
-        return  $(this).is(':visible');
-    });
-
-}
-
-$(document).ready(function () {
-    $("#startButtonsSelect :input").change(function () {
-        console.log("select")
-        startFromAgent(this.value);
-    });
-    $("#push_start_buttons_select :input").change(function () {
-        console.log("select")
-        startFromRepo(this.value);
-    });
-
-    // Bind events
-    $("form").submit(function(e) {
-        console.log("on submit form")
-        $("#start_new_deployment").button('loading');
-    });
-
-});
\ No newline at end of file
+        function build_file_list(title, list) {
+            $('#files_list_tbody').find('tr:gt(0)').remove();
+            $('#files_list_tbody_title').text(title)
+            for (var i in list) {
+                var template = '<tr><td>-</td><td>' + list[i] + '</td><td><button type="button" class="btn btn-default" onclick="" disabled><i class="fa fa-folder-open"></i></button></td></tr>'
+                $('#files_list_tbody').append(template)
+            }
+            $('#modal_files_list').modal('show');
+        }
\ No newline at end of file
diff --git a/static/src/vimhandler/vim_create.js b/static/src/vimhandler/vim_create.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/static/src/vimhandler/vim_create.js
