diff --git a/packagehandler/__init__.py b/packagehandler/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/packagehandler/__init__.py
diff --git a/packagehandler/apps.py b/packagehandler/apps.py
new file mode 100644
index 0000000..c795813
--- /dev/null
+++ b/packagehandler/apps.py
@@ -0,0 +1,21 @@
+#   Copyright 2018 EveryUP Srl
+#
+#   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.
+
+from __future__ import unicode_literals
+
+from django.apps import AppConfig
+
+
+class PackagehandlerConfig(AppConfig):
+    name = 'packagehandler'
diff --git a/packagehandler/migrations/__init__.py b/packagehandler/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/packagehandler/migrations/__init__.py
diff --git a/packagehandler/template/package_list.html b/packagehandler/template/package_list.html
new file mode 100644
index 0000000..9aebd12
--- /dev/null
+++ b/packagehandler/template/package_list.html
@@ -0,0 +1,284 @@
+{% extends "project_descriptors.html" %}
+{% load staticfiles %}
+
+
+{% block head_block %}
+  	{{ block.super }}
+<link rel="stylesheet" href="/static/bower_components/select2/dist/css/select2.min.css">
+{% endblock %}
+
+{% block title_header_big %}
+    {{ block.super }}
+  {% if package_type  %}
+     {{ package_type|upper }}
+  {% else%}
+    Undefined
+  {% endif %} Packages
+{% endblock %}
+
+{% block left_sidebar %}
+    {% include 'osm/osm_project_left_sidebar.html' %}
+{% endblock %}
+
+{% block breadcrumb_body %}
+  	{{ block.super }}
+    <li><a href="{% url 'projects:open_project' %}">{{project_id}}</a></li>
+    <li><a> {% if package_type  %}
+     {{ package_type }}
+  {% else%}
+    Undefined
+  {% endif %} Packages</a></li>
+
+{% endblock %}
+
+{% block content_body %}
+  	{{ block.super }}
+{% include 'osm/modal/files_list.html' %}
+{% include 'modal/instance_create.html' %}
+{% include 'modal/choose_package_name.html' %}
+<div class="row">
+    {% if package_type == 'ns' %}
+        {% include "package_list_ns.html" %}
+    {% elif package_type == 'vnf' %}
+        {% include "package_list_vnf.html" %}
+    {% endif %}
+    
+</div>
+{% endblock %}
+
+
+{% block resource_block %}
+  	{{ block.super }}
+     <script src="/static/bower_components/select2/dist/js/select2.js"></script>
+    <script src="/static/src/instancehandler/instance_create.js"></script>
+    <script src="/static/src/packagehandler/packages_list.js"></script>
+    <script src="/static/src/packagehandler/onboard_package.js"></script>
+
+    <script>
+    var csrf_token = '{{csrf_token}}';
+    var descr_list_url = '{% url "packages:list_packages"   package_type=package_type%}';
+    var new_desc_url = '{% url "packages:onboard_package"   package_type=package_type%}'
+    var vim_list_url = '{% url "vims:list"  %}';
+    var package_type = '{{ package_type | safe }}';
+    var project_id = '{{ project_id }}';
+    var table;
+    var row_builder = {
+        'ns': [
+                {
+                    "render": function (data, type, row) {
+                       return row['short-name'] || '';
+                    },
+                    "targets": 0
+                },
+                {
+                    "render": function (data, type, row) {
+                       return row['_id'];
+                    },
+                    "targets": 1
+                },
+                {
+                    "render": function (data, type, row) {
+                       return row['description'] || '';
+                    },
+                    "targets": 2
+                },
+                {
+                    "render": function (data, type, row) {
+                       return row['vendor'] || '';
+                    },
+                    "targets": 3
+                },
+                {
+                    "render": function (data, type, row) {
+                       return row['version'] || '';
+                    },
+                    "targets": 4
+                },
+                {
+                    "render": function (data, type, row) {
+                       var result = '<div class="btn-group">\n' ;
+                       
+                           result += '    <button type="button" class="btn btn-default" data-container="body"\n' +
+                               'data-toggle="tooltip" data-placement="top" title="Instantiate NS"\n' +
+                               'onclick="javascript:openModalCreateNS({ \'project_id\':\'' + project_id +'\', \'package_type\': \''+ package_type +'\', \'descriptor_name\':\''+row["name"]+'\', \'descriptor_id\':\''+row["_id"]+'\',\'vim_list_url\': \''+vim_list_url+'\',  \'nsd_list_url\': \''+descr_list_url+'\' })">\n' +
+                               '<i class="fa fa-paper-plane"></i></button>\n';
+                        result += '<button type="button" class="btn btn-default" data-container="body"\n' +
+                           '        data-toggle="tooltip" data-placement="top" title="Edit"\n' +
+                           '        onclick="javascript:openDescriptorView(\'nsd\', \''+row["_id"]+'\')">\n' +
+                           '    <i class="fa fa-edit"></i></button>\n' +
+                           '<button type="button" class="btn btn-default" data-container="body"\n' +
+                           '        data-toggle="tooltip" data-placement="top" title="Show content"\n' +
+                           '        onclick="javascript:openPackageContentList(\''+ package_type +'\', \''+row["_id"]+'\')">\n' +
+                           '    <i class="fa fa-folder-open"></i></button>\n' +
+                            '<button type="button" class="btn btn-default" data-container="body"\n' +
+                           '        data-toggle="tooltip" data-placement="top" title="Clone"\n' +
+                           '        onclick="javascript:clonePackage(\''+ package_type +'\', \''+row["_id"]+'\')">\n' +
+                           '    <i class="fa fa-clone"></i></button>\n';
+                           result += '<button type="button" class="btn btn-default" data-container="body"\n' +
+                           '        data-toggle="tooltip" data-placement="top" title="Show Graph"\n' +
+                           '  onclick="location.href=\'/projects/descriptors/composer?type=nsd&id='+row["_id"] +'\'"\n' +
+                           '        ><i class="fa fa-sitemap fa-fw"></i></button>\n';
+                        result +=
+                           '<button type="button" class="btn btn-default" data-container="body"\n' +
+                           '        data-toggle="tooltip" data-placement="top" title="Download package"\n' +
+                           '        onclick="location.href=\'/packages/'+package_type+'/'+ row["_id"] +'/download\'">\n' +
+                           '    <i class="fa fa-download fa-fw"></i></button>\n' +
+                           '<button type="button" class="btn btn-default" data-container="body"\n' +
+                           '        data-toggle="tooltip" data-placement="top" title="Delete"\n' +
+                           '        onclick="javascript:deletePackage( \'' + package_type + '\', \''+row["_id"] + '\', \''+row["name"] + '\')">\n' +
+                           '    <i class="far fa-trash-alt"></i></button>\n' +
+                           '</div>';
+
+                               return result
+                    },
+                    "targets": 5
+                }],
+        'vnf': [
+                {
+                    "render": function (data, type, row) {
+                       return row['short-name'] || '';
+                    },
+                    "targets": 0
+                },
+                {
+                    "render": function (data, type, row) {
+                       return row['_id'];
+                    },
+                    "targets": 1
+                },
+                {
+                    "render": function (data, type, row) {
+                       return row['_admin']['type'] || '';
+                    },
+                    "targets": 2
+                },
+                {
+                    "render": function (data, type, row) {
+                       return row['description'] || '';
+                    },
+                    "targets": 3
+                },
+                {
+                    "render": function (data, type, row) {
+                       return row['vendor'] || '';
+                    },
+                    "targets": 4
+                },
+                {
+                    "render": function (data, type, row) {
+                       return row['version'] || '';
+                    },
+                    "targets": 5
+                },
+                {
+                    "render": function (data, type, row) {
+                       var result = '<div class="btn-group">\n' ;
+                        result += '<button type="button" class="btn btn-default" data-container="body"\n' +
+                           '        data-toggle="tooltip" data-placement="top" title="Edit"\n' +
+                           '        onclick="javascript:openDescriptorView(\'vnfd\', \''+row["_id"]+'\')">\n' +
+                           '    <i class="fa fa-edit"></i></button>\n' +
+                           '<button type="button" class="btn btn-default" data-container="body"\n' +
+                           '        data-toggle="tooltip" data-placement="top" title="Show content"\n' +
+                           '        onclick="javascript:openPackageContentList(\''+ package_type +'\', \''+row["_id"]+'\')">\n' +
+                           '    <i class="fa fa-folder-open"></i></button>\n' +
+                            '<button type="button" class="btn btn-default" data-container="body"\n' +
+                           '        data-toggle="tooltip" data-placement="top" title="Clone"\n' +
+                           '        onclick="javascript:clonePackage(\''+ package_type +'\', \''+row["_id"]+'\')">\n' +
+                           '    <i class="fa fa-clone"></i></button>\n';
+                           result += '<button type="button" class="btn btn-default" data-container="body"\n' +
+                           '        data-toggle="tooltip" data-placement="top" title="Show Graph"\n' +
+                           '  onclick="location.href=\'/projects/descriptors/composer?type=vnfd&id='+row["_id"] +'\'"\n' +
+                           '        ><i class="fa fa-sitemap fa-fw"></i></button>\n';
+                        result +=
+                           '<button type="button" class="btn btn-default" data-container="body"\n' +
+                           '        data-toggle="tooltip" data-placement="top" title="Download package"\n' +
+                           '        onclick="location.href=\'/packages/'+package_type+'/'+ row["_id"] +'/download\'">\n' +
+                           '    <i class="fa fa-download fa-fw"></i></button>\n' +
+                           '<button type="button" class="btn btn-default" data-container="body"\n' +
+                           '        data-toggle="tooltip" data-placement="top" title="Delete"\n' +
+                           '        onclick="javascript:deletePackage( \'' + package_type + '\', \''+row["_id"] + '\', \''+row["name"] + '\')">\n' +
+                           '    <i class="far fa-trash-alt"></i></button>\n' +
+                           '</div>';
+
+                               return result
+                    },
+                    "targets": 6
+                }]
+    };
+    function refreshTable() {
+        var type_vnf = $('#type_vnf').val()
+        var url = (type_vnf && type_vnf !== '') ? ("/packages/" +package_type+"/list?type="+type_vnf) : ("/packages/" +package_type+"/list")
+        table.ajax.url(url);
+        table.ajax.reload();
+    }
+
+    $(document).ready( function () {
+        table = $('#descriptors_table').DataTable({
+            responsive: true,
+            "ajax": {
+                "url": "/packages/" +package_type+"/list",
+                "dataSrc": function (json) {
+                    return json['descriptors'];
+                },
+                statusCode: {
+                    401: function () {
+                        console.log("no auth");
+                        moveToLogin(window.location.pathname);
+                    }
+                },
+                "error": function (hxr, error, thrown) {
+
+                }
+
+            },
+            "columns": row_builder[package_type]
+
+        });
+
+        setInterval(refreshTable, 10000);
+
+
+        $("#formCreatePackage").submit(function (event) {
+                event.preventDefault(); //prevent default action
+                var post_url = $(this).attr("action"); //get form action url
+                var request_method = $(this).attr("method");
+                var form_data = new FormData(this); //Encode form elements for submission
+
+                $.ajax({
+                    url: post_url,
+                    type: request_method,
+                    data: form_data,
+                    headers: {
+                        "Accept": 'application/json'
+                    },
+                    contentType: false,
+                    processData: false
+                }).done(function (response, textStatus, jqXHR) {
+                    var map = {
+                        ns: 'nsd',
+                        vnf: 'vnfd'
+                    };
+                    location.href='/projects/descriptors/composer?type=' + map[response['data']['type']]+'&id=' + response['data']['id'];
+                }).fail(function (result) {
+                    var data = result.responseJSON;
+                    var title = "Error " + (data.code ? data.code : 'unknown');
+                    var message = data.detail ? data.detail : 'No detail available.';
+                    bootbox.alert({
+                        title: title,
+                        message: message
+                    });
+                });
+            });
+    });
+
+    $(document).on('change', '#type_vnf', function(){
+        refreshTable();
+    });
+    </script>
+
+
+{% endblock %}
+
+{% block footer %}
+    {% include "footer.html"  %}
+{% endblock %}
diff --git a/packagehandler/template/package_list_ns.html b/packagehandler/template/package_list_ns.html
new file mode 100644
index 0000000..3fae096
--- /dev/null
+++ b/packagehandler/template/package_list_ns.html
@@ -0,0 +1,48 @@
+{% load staticfiles %}
+{% load get %}
+<div class="col-md-12">
+
+    <div class="box">
+        <div class="box-header with-border">
+            <h3 class="box-title">
+            </h3>
+            <div class="box-tools">
+                <div class="btn-group">
+                    <button type="button" class="btn btn-default" data-toggle="modal" data-target="#modal_new_package_name_chooser" >
+                <i class="fa fa-paint-brush"></i> <span> Compose a new {{ package_type|upper }}</span></button>
+                </div>
+            </div>
+        </div>
+        <div class="box-body">
+            <table id="descriptors_table" class="table table-bordered table-striped dataTable"
+                   role="grid">
+                <thead>
+                <tr role="row">
+                    <th>Short Name</th>
+                    <th>Identified</th>
+                    <th>Description</th>
+                    <th style="width:10%">Vendor</th>
+                    <th style="width:5%">Version</th>
+                    <th style="width:35%">Actions</th>
+                </tr>
+                </thead>
+                <tbody>
+
+                </tbody>
+
+            </table>
+        </div>
+    </div>
+</div>
+
+<div class="col-sm-12">
+    <div class="box box-solid">
+        <div class="box-body">
+
+            <div class="upload-drop-zone" id="drop-zone">
+               <i class="fa fa-upload"></i> Just drag and drop files here
+            </div>
+        </div>
+    </div>
+</div>
+
diff --git a/packagehandler/template/package_list_vnf.html b/packagehandler/template/package_list_vnf.html
new file mode 100644
index 0000000..ead7d94
--- /dev/null
+++ b/packagehandler/template/package_list_vnf.html
@@ -0,0 +1,56 @@
+{% load staticfiles %}
+{% load get %}
+<div class="col-md-12">
+
+    <div class="box">
+        <div class="box-header with-border">
+            <h3 class="box-title">
+            </h3>
+            <div class="box-tools">
+                <div class="btn-group">
+                    <button type="button" class="btn btn-default" data-toggle="modal" data-target="#modal_new_package_name_chooser" >
+                <i class="fa fa-paint-brush"></i> <span> Compose a new {{ package_type|upper }}</span></button>
+                </div>
+            </div>
+        </div>
+        <div class="box-body">
+            <table id="descriptors_table" class="table table-bordered table-striped dataTable"
+                   role="grid">
+                <thead>
+                <tr role="row">
+                    <th>Short Name</th>
+                    <th>Identified</th>
+                    <th>
+                        <select name="type" id="type_vnf" class="form-control">
+                        <option value="">Type</option>
+                        <option value="vnfd">VNF</option>
+                        <option value="pnfd">PNF</option>
+                        <option value="hnfd">HNF</option>
+                        </select>
+                    </th>
+                    <th>Description</th>
+                    <th style="width:10%">Vendor</th>
+                    <th style="width:5%">Version</th>
+                    <th style="width:35%">Actions</th>
+                </tr>
+                </thead>
+                <tbody>
+
+                </tbody>
+
+            </table>
+        </div>
+    </div>
+</div>
+
+<div class="col-sm-12">
+    <div class="box box-solid">
+        <div class="box-body">
+
+            <div class="upload-drop-zone" id="drop-zone">
+               <i class="fa fa-upload"></i> Just drag and drop files here
+            </div>
+        </div>
+    </div>
+</div>
+
diff --git a/packagehandler/urls.py b/packagehandler/urls.py
new file mode 100644
index 0000000..2a0c513
--- /dev/null
+++ b/packagehandler/urls.py
@@ -0,0 +1,27 @@
+#   Copyright 2018 EveryUP Srl
+#
+#   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.
+
+from django.conf.urls import url
+from packagehandler import views
+
+urlpatterns = [
+    url(r'(?P<package_type>\w+)/list$', views.show_packages, name='list_packages'),
+    url(r'(?P<package_type>\w+)/create', views.create_package_empty, name='create_package_empty'),
+    url(r'(?P<package_type>\w+)/(?P<package_id>[-\w]+)/delete$', views.delete_package, name='delete_package'),
+    url(r'(?P<package_type>\w+)/(?P<package_id>[-\w]+)/clone', views.clone_package, name='clone_package'),
+    url(r'(?P<package_type>\w+)/(?P<package_id>[-\w]+)/download', views.download_pkg, name='download_package'),
+    url(r'(?P<package_type>\w+)/(?P<package_id>[-\w]+)/action/(?P<action_name>[-\w]+)', views.custom_action,
+        name='custom_action'),
+    url(r'(?P<package_type>\w+)/new$', views.onboard_package, name='onboard_package'),
+]
\ No newline at end of file
diff --git a/packagehandler/views.py b/packagehandler/views.py
new file mode 100644
index 0000000..9783348
--- /dev/null
+++ b/packagehandler/views.py
@@ -0,0 +1,217 @@
+#   Copyright 2018 EveryUP Srl
+#
+#   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.
+
+import json
+import logging
+
+import yaml
+from sf_t3d.decorators import login_required
+from django.http import HttpResponse
+from django.shortcuts import render, redirect
+
+
+from lib.util import Util
+from lib.osm.osmclient.clientv2 import Client
+from lib.osm.osm_rdcl_parser import OsmParser
+from lib.osm.osm_util import OsmUtil
+import authosm.utils as osmutils
+
+logging.basicConfig(level=logging.DEBUG)
+log = logging.getLogger('packagehandler/view.py')
+
+
+@login_required
+def show_packages(request, package_type=None):
+    user = osmutils.get_user(request)
+    project_id = user.project_id
+    client = Client()
+    filter = request.GET.get('type')
+    try:
+        if package_type == 'ns':
+            descriptors = client.nsd_list(user.get_token(),filter)
+        elif package_type == 'vnf':
+            descriptors = client.vnfd_list(user.get_token(),filter)
+    except Exception as e:
+        log.exception(e)
+        descriptors = []
+
+    url = 'package_list.html'
+    return __response_handler(request, {
+        'descriptors': descriptors['data'] if descriptors and descriptors['error'] is False else [],
+        'project_id': project_id,
+        'project_type': 'osm',
+        'package_type': package_type
+    }, url)
+
+@login_required
+def create_package_empty(request, package_type=None):
+    user = osmutils.get_user(request)
+    pkg_name = request.POST.get('name', '')
+    try:
+        client = Client()
+        if package_type == 'ns':
+            result = client.nsd_create_pkg_base(user.get_token(), pkg_name)
+        elif package_type == 'vnf':
+            result = client.vnfd_create_pkg_base(user.get_token(), pkg_name)
+        else:
+            log.debug('Update descriptor: Unknown data type')
+            result = {'error': True, 'data': 'Update descriptor: Unknown data type'}
+    except Exception as e:
+        log.exception(e)
+        result = {'error': True, 'data': str(e)}
+
+    if result['error'] == True:
+        return __response_handler(request, result['data'], url=None,
+                                  status=result['data']['status'] if 'status' in result['data'] else 500)
+    else:
+        result['data']['type'] = package_type
+        return __response_handler(request, result, url=None, status=200)
+
+
+@login_required
+def delete_package(request, package_type=None, package_id=None):
+    user = osmutils.get_user(request)
+    project_id = user.project_id
+    try:
+        client = Client()
+        if package_type == 'ns':
+            result = client.nsd_delete(user.get_token(), package_id)
+        elif package_type == 'vnf':
+            result = client.vnfd_delete(user.get_token(), package_id)
+    except Exception as e:
+        log.exception(e)
+        result = {'error': True, 'data': str(e)}
+
+    url = 'package_list.html'
+    descriptors = {}
+    try:
+        if package_type == 'ns':
+            descriptors = client.nsd_list(user.get_token())
+        elif package_type == 'vnf':
+            descriptors = client.vnfd_list(user.get_token())
+    except Exception as e:
+        log.exception(e)
+
+    return __response_handler(request, {
+        'descriptors': descriptors['data'] if descriptors and descriptors['error'] is False else [],
+        'project_id': project_id,
+        'project_type': 'osm',
+        'package_type': package_type,
+        'alert_message': {
+            'success': False if result['error'] is True else True,
+            'message': 'An error occurred while processing your request.' if result and result['error'] is True else "Record deleted successfully"}
+    }, url)
+
+@login_required
+def clone_package(request, package_type=None, package_id=None):
+    user = osmutils.get_user(request)
+    try:
+        client = Client()
+        if package_type == 'ns':
+            result = client.nsd_clone(user.get_token(), package_id)
+        elif package_type == 'vnf':
+            result = client.vnfd_clone(user.get_token(), package_id)
+        else:
+            log.debug('Update descriptor: Unknown data type')
+            result = {'error': True, 'data': 'Update descriptor: Unknown data type'}
+    except Exception as e:
+        log.exception(e)
+        result = {'error': True, 'data': str(e)}
+    if result['error'] == True:
+        return __response_handler(request, result['data'], url=None,
+                                  status=result['data']['status'] if 'status' in result['data'] else 500)
+    else:
+        return __response_handler(request, {}, url=None, status=200)
+
+@login_required
+def download_pkg(request, package_id, package_type):
+    user = osmutils.get_user(request)
+    file_name = "osm_export.tar.gz"
+    tar_pkg = None
+    try:
+        client = Client()
+        if package_type == 'ns':
+            tar_pkg = client.get_nsd_pkg(user.get_token(), package_id)
+        elif package_type == 'vnf':
+            tar_pkg = client.get_vnfd_pkg(user.get_token(), package_id)
+
+    except Exception as e:
+        log.exception(e)
+    
+    response = HttpResponse(content_type="application/tgz")
+    response["Content-Disposition"] = "attachment; filename="+ file_name
+    response.write(tar_pkg.getvalue())
+    return response
+
+@login_required
+def onboard_package(request, package_type=None):
+    user = osmutils.get_user(request)
+    if request.method == 'POST':
+        data_type = request.POST.get('type')
+        if data_type == "file":
+            file_uploaded = request.FILES['file']
+
+            try:
+                client = Client()
+                if package_type == 'ns':
+                    result = client.nsd_onboard(user.get_token(), file_uploaded)
+                elif package_type == 'vnf':
+                    result = client.vnfd_onboard(user.get_token(), file_uploaded)
+                else:
+                    log.debug('Create descriptor: Unknown data type')
+                    result = {'error': True, 'data': 'Create descriptor: Unknown data type'}
+
+            except Exception as e:
+                log.exception(e)
+                result = {'error': True, 'data': str(e)}
+        else:
+            result = {'error': True, 'data': 'Create descriptor: Unknown data type'}
+
+        if result['error']:
+            return __response_handler(request, result['data'], url=None, status=result['data']['status'] if 'status' in result['data'] else 500)
+        else:
+            return __response_handler(request, {}, url=None, status=200)
+
+@login_required
+def get_package_files_list(request, package_id, package_type):
+    user = osmutils.get_user(request)
+    try:
+        client = Client()
+        if package_type == 'ns':
+            artifacts_res = client.nsd_artifacts(user.get_token(), package_id)
+        elif package_type == 'vnf':
+            artifacts_res = client.vnf_packages_artifacts(user.get_token(), package_id)
+        else:
+            return False
+
+        files_list = yaml.load(artifacts_res['data'] if artifacts_res and artifacts_res['error'] is False else [])
+        result = {'files': files_list}
+    except Exception as e:
+        log.exception(e)
+        result = {'error_msg': 'Unknown error.'}
+    return __response_handler(request, result)
+
+@login_required
+def custom_action(request, package_id=None, package_type=None, action_name=None):
+    if request.method == 'GET':
+        return globals()[action_name](request, package_id, package_type)
+
+def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
+    raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
+    if 'application/json' in raw_content_types or url is None:
+        return HttpResponse(json.dumps(data_res), content_type="application/json", *args, **kwargs)
+    elif to_redirect:
+        return redirect(url, *args, **kwargs)
+    else:
+        return render(request, url, data_res)
\ No newline at end of file
