Begin refactoring process, messy template usage
diff --git a/gstack/controllers/__init__.py b/gstack/controllers/__init__.py
index 47e309d..13e35e8 100644
--- a/gstack/controllers/__init__.py
+++ b/gstack/controllers/__init__.py
@@ -20,5 +20,12 @@
 import os
 import glob
 
-__all__ = [os.path.basename(
-    f)[:-3] for f in glob.glob(os.path.dirname(__file__) + '/*.py')]
+__all__ = [os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(__file__) + '/*.py')]
+
+
+def filter_by_name(data, name):
+    for item in data:
+        if item['name'] == name:
+            return item
+
+    return None
diff --git a/gstack/controllers/disks.py b/gstack/controllers/disks.py
index 0743a48..888507e 100644
--- a/gstack/controllers/disks.py
+++ b/gstack/controllers/disks.py
@@ -21,7 +21,9 @@
 from flask import request, url_for
 from gstack import app, authentication
 from gstack.services import requester
-from gstack.controllers import zones, helper, errors
+from gstack import helpers
+from gstack import controllers
+from gstack.controllers import zones, errors
 
 
 def _get_disks(authorization, args=None):
@@ -47,7 +49,7 @@
     )
 
     if disk_list['listvolumesresponse']:
-        response = helper.filter_by_name(
+        response = controllers.filter_by_name(
             data=disk_list['listvolumesresponse']['volume'],
             name=disk
         )
@@ -66,7 +68,7 @@
     response['description'] = cloudstack_response['name']
     response['sizeGb'] = cloudstack_response['size']
 
-    response['selfLink'] = urllib.unquote_plus(helper.get_root_url() + url_for(
+    response['selfLink'] = urllib.unquote_plus(helpers.get_root_url() + url_for(
         'getmachinetype',
         projectid=projectid,
         machinetype=cloudstack_response['name'],
@@ -88,7 +90,7 @@
     zone_list = zones.get_zone_names(authorization=authorization)
 
     disk = None
-    filter = helper.get_filter(request.args)
+    filter = helpers.get_filter(request.args)
 
     if 'name' in filter:
         disk = filter['name']
@@ -130,14 +132,14 @@
         'items': items
     }
 
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
 
 
 @app.route('/compute/v1/projects/<projectid>/zones/<zone>/disks', methods=['GET'])
 @authentication.required
 def listdisks(projectid, authorization, zone):
     disk = None
-    filter = helper.get_filter(request.args)
+    filter = helpers.get_filter(request.args)
 
     if 'name' in filter:
         disk = filter['name']
@@ -150,7 +152,7 @@
             args={'keyword': disk}
         )
         if disk_list['listvolumesresponse']:
-            disk = helper.filter_by_name(
+            disk = controllers.filter_by_name(
                 data=disk_list['listvolumesresponse']['volume'],
                 name=disk
             )
@@ -181,7 +183,7 @@
         'items': items
     }
 
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
 
 
 @app.route('/compute/v1/projects/<projectid>/zones/<zone>/disks/<disk>', methods=['GET'])
@@ -193,7 +195,7 @@
     )
 
     if response:
-        return helper.create_response(
+        return helpers.create_response(
             data=_cloudstack_volume_to_gce(
                 cloudstack_response=response,
                 projectid=projectid,
diff --git a/gstack/controllers/helper.py b/gstack/controllers/helper.py
deleted file mode 100644
index 05830ce..0000000
--- a/gstack/controllers/helper.py
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/env python
-# encoding: utf-8
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you 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.
-
-import urllib
-from gstack import app
-from flask import jsonify
-
-
-def create_response(data):
-    res = jsonify(data)
-    res.status_code = 200
-
-    return res
-
-
-def get_filter(data):
-    filter = {}
-
-    if 'filter' in data:
-        filter = urllib.unquote_plus(data['filter'])
-        filter = dict(filter.split(' eq ') for values in filter)
-
-    return filter
-
-
-def filter_by_name(data, name):
-    for item in data:
-        if item['name'] == name:
-            return item
-    return None
-
-
-def get_root_url():
-    return 'https://' + \
-        app.config['GSTACK_BIND_ADDRESS'] + ':' + app.config['GSTACK_PORT']
diff --git a/gstack/controllers/images.py b/gstack/controllers/images.py
index 25c400a..c2e5ec5 100755
--- a/gstack/controllers/images.py
+++ b/gstack/controllers/images.py
@@ -20,7 +20,9 @@
 import urllib
 from gstack import app, authentication
 from gstack.services import requester
-from gstack.controllers import helper, errors
+from gstack import helpers
+from gstack import controllers
+from gstack.controllers import errors
 from flask import request, url_for
 
 
@@ -50,7 +52,7 @@
     )
 
     if image_list['listtemplatesresponse']:
-        response = helper.filter_by_name(
+        response = controllers.filter_by_name(
             data=image_list['listtemplatesresponse']['template'],
             name=image
         )
@@ -62,6 +64,7 @@
 def _create_populated_image_response(projectid, images=None):
     if not images:
         images = []
+
     populated_response = {
         'kind': 'compute#imageList',
         'selfLink': request.base_url,
@@ -98,14 +101,14 @@
 @authentication.required
 def listnocentoscloudimages(authorization):
     populated_response = _create_populated_image_response('centos-cloud')
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
 
 
 @app.route('/compute/v1/projects/debian-cloud/global/images', methods=['GET'])
 @authentication.required
 def listnodebiancloudimages(authorization):
     populated_response = _create_populated_image_response('debian-cloud')
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
 
 
 @app.route('/compute/v1/projects/<projectid>/global/images', methods=['GET'])
@@ -115,15 +118,20 @@
         authorization=authorization
     )
 
-    images = []
     if image_list['listtemplatesresponse']:
         for image in image_list['listtemplatesresponse']['template']:
-            images.append(_cloudstack_template_to_gce(
-                cloudstack_response=image,
-                selfLink=request.base_url + '/' + image['name']))
+            image['selflink'] = request.base_url + '/' + image['name']
 
-    populated_response = _create_populated_image_response(projectid, images)
-    return helper.create_response(data=populated_response)
+    kwargs = {
+        'template_name_or_list': 'images.json',
+        'selflink': request.base_url,
+        'request_id': 'projects/' + projectid + '/global/images',
+        'request_kind': 'compute#imageList',
+        'response': image_list['listtemplatesresponse']
+    }
+    return helpers.successful_response(
+        **kwargs
+    )
 
 
 @app.route('/compute/v1/projects/<projectid>/global/images/<image>', methods=['GET'])
@@ -135,7 +143,7 @@
     )
 
     if response:
-        return helper.create_response(
+        return helpers.create_response(
             data=_cloudstack_template_to_gce(response)
         )
     else:
diff --git a/gstack/controllers/index.py b/gstack/controllers/index.py
index 293c6ac..fc1f925 100755
--- a/gstack/controllers/index.py
+++ b/gstack/controllers/index.py
@@ -19,7 +19,7 @@
 
 
 from gstack import app
-from gstack.controllers import helper
+from gstack import helpers
 import json
 
 
@@ -28,9 +28,9 @@
     with open(app.config['DATA'] + '/v1.json') as template:
         discovery_template = json.loads(template.read())
 
-    discovery_template['baseUrl'] = helper.get_root_url() + '/' + app.config['PATH']
+    discovery_template['baseUrl'] = helpers.get_root_url() + '/' + app.config['PATH']
     discovery_template['basePath'] = '/' + app.config['PATH']
-    discovery_template['rootUrl'] = helper.get_root_url() + '/'
+    discovery_template['rootUrl'] = helpers.get_root_url() + '/'
     discovery_template['servicePath'] = app.config['PATH']
 
-    return helper.create_response(data=discovery_template)
+    return helpers.create_response(data=discovery_template)
diff --git a/gstack/controllers/instances.py b/gstack/controllers/instances.py
index 8bb0e14..4c196ae 100755
--- a/gstack/controllers/instances.py
+++ b/gstack/controllers/instances.py
@@ -19,10 +19,12 @@
 
 import json
 import urllib
+from gstack import helpers
+from gstack import controllers
 from flask import request, url_for
 from gstack import app, authentication
 from gstack.services import requester
-from gstack.controllers import zones, helper, operations, images, errors, machine_type, networks
+from gstack.controllers import zones, operations, images, errors, machine_type, networks
 
 
 def _get_virtual_machines(authorization, args=None):
@@ -134,7 +136,7 @@
 
     response['networkInterfaces'].append(networking)
 
-    response['selfLink'] = urllib.unquote_plus(helper.get_root_url() + url_for(
+    response['selfLink'] = urllib.unquote_plus(helpers.get_root_url() + url_for(
         'getinstance',
         projectid=projectid,
         instance=cloudstack_response['name'],
@@ -154,7 +156,7 @@
     )
 
     if virtual_machine_list['listvirtualmachinesresponse']:
-        response = helper.filter_by_name(
+        response = controllers.filter_by_name(
             data=virtual_machine_list['listvirtualmachinesresponse']['virtualmachine'],
             name=instance
         )
@@ -170,7 +172,7 @@
     virtual_machine_list = _get_virtual_machines(authorization=authorization)
 
     instance = None
-    filter = helper.get_filter(request.args)
+    filter = helpers.get_filter(request.args)
 
     if 'name' in filter:
         instance = filter['name']
@@ -211,14 +213,14 @@
         'selfLink': request.base_url,
         'items': items
     }
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
 
 
 @app.route('/compute/v1/projects/<projectid>/zones/<zone>/instances', methods=['GET'])
 @authentication.required
 def listinstances(authorization, projectid, zone):
     instance = None
-    filter = helper.get_filter(request.args)
+    filter = helpers.get_filter(request.args)
 
     if 'name' in filter:
         instance = filter['name']
@@ -258,7 +260,7 @@
         'items': items
     }
 
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
 
 
 @app.route('/compute/v1/projects/<projectid>/zones/<zone>/instances/<instance>', methods=['GET'])
@@ -270,7 +272,7 @@
     )
 
     if response:
-        return helper.create_response(
+        return helpers.create_response(
             data=_cloudstack_virtual_machine_to_gce(
                 cloudstack_response=response,
                 projectid=projectid,
@@ -325,7 +327,7 @@
             authorization=authorization
         )
 
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
 
 
 @app.route('/compute/v1/projects/<projectid>/zones/<zone>/instances/<instance>', methods=['DELETE'])
@@ -339,4 +341,4 @@
         authorization=authorization
     )
 
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
diff --git a/gstack/controllers/machine_type.py b/gstack/controllers/machine_type.py
index f55e211..9dfd71b 100755
--- a/gstack/controllers/machine_type.py
+++ b/gstack/controllers/machine_type.py
@@ -20,8 +20,10 @@
 import urllib
 from gstack import app
 from gstack import authentication
+from gstack import helpers
+from gstack import controllers
 from gstack.services import requester
-from gstack.controllers import errors, zones, helper
+from gstack.controllers import errors, zones
 from flask import request, url_for
 
 
@@ -45,7 +47,7 @@
     )
 
     if machinetype_list['listserviceofferingsresponse']:
-        response = helper.filter_by_name(
+        response = controllers.filter_by_name(
             data=machinetype_list['listserviceofferingsresponse'][
                 'serviceoffering'],
             name=machinetype
@@ -65,7 +67,7 @@
     response['guestCpus'] = cloudstack_response['cpunumber']
     response['memoryMb'] = cloudstack_response['memory']
 
-    response['selfLink'] = urllib.unquote_plus(helper.get_root_url() + url_for(
+    response['selfLink'] = urllib.unquote_plus(helpers.get_root_url() + url_for(
         'getmachinetype',
         projectid=projectid,
         machinetype=cloudstack_response['name'],
@@ -107,14 +109,14 @@
         'selfLink': urllib.unquote_plus(request.base_url),
         'items': items
     }
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
 
 
 @app.route('/compute/v1/projects/<projectid>/zones/<zone>/machineTypes', methods=['GET'])
 @authentication.required
 def listmachinetype(projectid, authorization, zone):
     machinetype = None
-    filter = helper.get_filter(request.args)
+    filter = helpers.get_filter(request.args)
 
     if 'name' in filter:
         machinetype = filter['name']
@@ -127,7 +129,7 @@
             args={'keyword': machinetype}
         )
         if machinetype_list['listserviceofferingsresponse']:
-            machinetype = helper.filter_by_name(
+            machinetype = controllers.filter_by_name(
                 data=machinetype_list['listserviceofferingsresponse'][
                     'serviceoffering'],
                 name=machinetype
@@ -159,7 +161,7 @@
         'items': items
     }
 
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
 
 
 @app.route('/compute/v1/projects/<projectid>/zones/<zone>/machineTypes/<machinetype>', methods=['GET'])
@@ -171,7 +173,7 @@
     )
 
     if response:
-        return helper.create_response(
+        return helpers.create_response(
             data=_cloudstack_machinetype_to_gce(
                 cloudstack_response=response,
                 projectid=projectid,
diff --git a/gstack/controllers/networks.py b/gstack/controllers/networks.py
index 03a1799..ae2aef5 100644
--- a/gstack/controllers/networks.py
+++ b/gstack/controllers/networks.py
@@ -19,10 +19,12 @@
 
 import urllib
 import json
+from gstack import helpers
+from gstack import controllers
 from flask import request, url_for
 from gstack import app, authentication
 from gstack.services import requester
-from gstack.controllers import helper, errors
+from gstack.controllers import errors
 
 
 def _get_networks(authorization, args=None):
@@ -48,7 +50,7 @@
     )
 
     if securitygroup_list['listsecuritygroupsresponse']:
-        response = helper.filter_by_name(
+        response = controllers.filter_by_name(
             data=securitygroup_list['listsecuritygroupsresponse']['securitygroup'],
             name=securitygroup
         )
@@ -138,7 +140,7 @@
         projectid,
         networks
     )
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
 
 
 @app.route('/compute/v1/projects/<projectid>/global/networks/<network>', methods=['GET'])
@@ -150,7 +152,7 @@
     )
 
     if response:
-        return helper.create_response(
+        return helpers.create_response(
             data=_cloudstack_network_to_gce(response)
         )
     else:
@@ -190,7 +192,7 @@
             'kind': 'compute#operation',
             'operationType': 'insert',
             'targetLink': urllib.unquote_plus(
-                helper.get_root_url() + url_for(
+                helpers.get_root_url() + url_for(
                     'getnetwork',
                     projectid=projectid,
                     network=data['name']
@@ -200,7 +202,7 @@
             'progress': 100
         }
 
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
 
 
 @app.route('/compute/v1/projects/<projectid>/global/networks/<network>', methods=['DELETE'])
@@ -224,4 +226,4 @@
         'progress': 100
     }
 
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
diff --git a/gstack/controllers/operations.py b/gstack/controllers/operations.py
index de31b32..9bbdd46 100644
--- a/gstack/controllers/operations.py
+++ b/gstack/controllers/operations.py
@@ -20,7 +20,7 @@
 import urllib
 from gstack import app, publickey_storage
 from gstack import authentication
-from gstack.controllers import helper
+from gstack import helpers
 from gstack.services import requester
 from flask import url_for
 
@@ -43,7 +43,7 @@
         'operationType': 'delete',
         'name': async_result['jobid'],
         'startTime': async_result['created'],
-        'selfLink': urllib.unquote_plus(helper.get_root_url() + url_for(
+        'selfLink': urllib.unquote_plus(helpers.get_root_url() + url_for(
             'getoperations',
             projectid=projectid,
             operationid=async_result['jobid']
@@ -57,14 +57,14 @@
     elif async_result['jobstatus'] is 1:
         populated_response['status'] = 'DONE'
         populated_response['zone'] = urllib.unquote_plus(
-            helper.get_root_url() +
+            helpers.get_root_url() +
             url_for(
                 'getzone',
                 projectid=projectid,
                 zone=async_result['jobresult']['virtualmachine']['zonename'],
             ))
         populated_response['targetLink'] = urllib.unquote_plus(
-            helper.get_root_url() +
+            helpers.get_root_url() +
             url_for(
                 'getinstance',
                 projectid=projectid,
@@ -112,7 +112,7 @@
         'user': async_result['userid'],
         'insertTime': async_result['created'],
         'startTime': async_result['created'],
-        'selfLink': urllib.unquote_plus(helper.get_root_url() + url_for(
+        'selfLink': urllib.unquote_plus(helpers.get_root_url() + url_for(
             'getoperations',
             projectid=projectid,
             operationid=async_result['jobid']
@@ -129,14 +129,14 @@
         populated_response['status'] = 'DONE'
         populated_response['id'] = async_result['jobid']
         populated_response['zone'] = urllib.unquote_plus(
-            helper.get_root_url() +
+            helpers.get_root_url() +
             url_for(
                 'getzone',
                 projectid=projectid,
                 zone=async_result['jobresult']['virtualmachine']['zonename'],
             ))
         populated_response['targetLink'] = urllib.unquote_plus(
-            helper.get_root_url() +
+            helpers.get_root_url() +
             url_for(
                 'getinstance',
                 projectid=projectid,
@@ -182,7 +182,7 @@
 @app.route('/compute/v1/projects/<projectid>/global/operations/<operationid>', methods=['GET'])
 @authentication.required
 def getoperations(authorization, operationid, projectid):
-    return helper.create_response(create_response(
+    return helpers.create_response(create_response(
         authorization=authorization,
         operationid=operationid,
         projectid=projectid
diff --git a/gstack/controllers/project.py b/gstack/controllers/project.py
index d6e0776..066724c 100755
--- a/gstack/controllers/project.py
+++ b/gstack/controllers/project.py
@@ -19,8 +19,10 @@
 
 from gstack import app, publickey_storage
 from gstack import authentication
+from gstack import helpers
+from gstack import controllers
 from gstack.services import requester
-from gstack.controllers import errors, helper
+from gstack.controllers import errors
 from flask import jsonify, request, url_for
 import json
 import urllib
@@ -87,7 +89,7 @@
     )
 
     if account_list['listaccountsresponse']:
-        response = helper.filter_by_name(
+        response = controllers.filter_by_name(
             data=account_list['listaccountsresponse']['account'],
             name=projectid
         )
@@ -213,7 +215,7 @@
     res = jsonify({
         "kind": "compute#operation",
         'operationType': 'setMetadata',
-        'targetLink': urllib.unquote_plus(helper.get_root_url() + url_for(
+        'targetLink': urllib.unquote_plus(helpers.get_root_url() + url_for(
             'getproject',
             projectid=projectid
         )),
diff --git a/gstack/controllers/regions.py b/gstack/controllers/regions.py
index 50f3e5d..dc7d071 100755
--- a/gstack/controllers/regions.py
+++ b/gstack/controllers/regions.py
@@ -19,9 +19,10 @@
 
 
 from gstack import app
+from gstack import helpers
 from gstack import authentication
 from gstack.services import requester
-from gstack.controllers import errors, helper
+from gstack.controllers import errors
 from flask import request, url_for
 
 
@@ -65,7 +66,7 @@
         'selfLink': request.base_url,
         'items': regions
     }
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
 
 
 @app.route('/compute/v1/projects/<projectid>/regions/<region>', methods=['GET'])
@@ -77,7 +78,7 @@
     )
 
     if region == cloudstack_response['listregionsresponse']['region'][0]['name']:
-        return helper.create_response(
+        return helpers.create_response(
             data=_cloudstack_region_to_gce(
                 cloudstack_response['listregionsresponse']['region'][0]
             )
diff --git a/gstack/controllers/zones.py b/gstack/controllers/zones.py
index 8e433f3..7738333 100755
--- a/gstack/controllers/zones.py
+++ b/gstack/controllers/zones.py
@@ -18,9 +18,11 @@
 # under the License.
 
 from flask import request, url_for
+from gstack import helpers
+from gstack import controllers
 from gstack import app, authentication
 from gstack.services import requester
-from gstack.controllers import helper, errors
+from gstack.controllers import errors
 
 
 def _get_zones(authorization, args=None):
@@ -46,7 +48,7 @@
     )
 
     if zone_list['listzonesresponse']:
-        response = helper.filter_by_name(
+        response = controllers.filter_by_name(
             data=zone_list['listzonesresponse']['zone'],
             name=zone
         )
@@ -99,7 +101,7 @@
         'items': items
     }
 
-    return helper.create_response(data=populated_response)
+    return helpers.create_response(data=populated_response)
 
 
 @app.route('/compute/v1/projects/<projectid>/zones/<zone>', methods=['GET'])
@@ -111,7 +113,7 @@
     )
 
     if response:
-        return helper.create_response(
+        return helpers.create_response(
             data=_cloudstack_zone_to_gce(response)
         )
     else:
diff --git a/gstack/helpers.py b/gstack/helpers.py
index d8dddd9..556bf27 100644
--- a/gstack/helpers.py
+++ b/gstack/helpers.py
@@ -18,6 +18,44 @@
 # under the License.
 
 import os
+import urllib
+from gstack import app
+from flask import jsonify, render_template, make_response
+
+
+def create_response(data):
+    res = jsonify(data)
+    res.status_code = 200
+
+    return res
+
+
+def successful_response(**kwargs):
+    content = render_template(**kwargs)
+    response = make_response(content)
+    print response
+    response.headers['Content-Type'] = 'application/json'
+    return _create_response(response, '200')
+
+
+def _create_response(response, code):
+    response.status_code = int(code)
+    return response
+
+
+def get_filter(data):
+    filter = {}
+
+    if 'filter' in data:
+        filter = urllib.unquote_plus(data['filter'])
+        filter = dict(filter.split(' eq ') for values in filter)
+
+    return filter
+
+
+def get_root_url():
+    return 'https://' + \
+        app.config['GSTACK_BIND_ADDRESS'] + ':' + app.config['GSTACK_PORT']
 
 
 def read_file(name):
diff --git a/gstack/templates/images.json b/gstack/templates/images.json
new file mode 100644
index 0000000..d986853
--- /dev/null
+++ b/gstack/templates/images.json
@@ -0,0 +1,13 @@
+{% extends "response.json" %}{% block response_content %}
+    "items":[{% for image in response.template %}
+        {
+            "creationTimestamp":"{{response.template|length}}",
+            "description":"{{image.displaytext}}",
+            "id":"{{image.id}}",
+            "kind":"compute#image",
+            "name":"{{image.name}}",
+            "selfLink":"{{image.selflink}}",
+            "status":"{{image.isready}}"
+        }{% if loop.index < response.template|length %},{% endif %}{% endfor %}
+    ]
+{% endblock %}
diff --git a/gstack/templates/response.json b/gstack/templates/response.json
new file mode 100644
index 0000000..1bc68d1
--- /dev/null
+++ b/gstack/templates/response.json
@@ -0,0 +1,6 @@
+{
+    {% if not error %}"id":"{{request_id}}",
+    "kind":"{{request_kind}}",
+    "selfLink":"{{selflink}}",{% block response_content %}
+    {% endblock %}{% endif %}
+}
diff --git a/setup.py b/setup.py
index 576eb24..e49f8be 100755
--- a/setup.py
+++ b/setup.py
@@ -45,7 +45,8 @@
     url="https://github.com/NOPping/gstack",
     platforms=("Any"),
     license="LICENSE.txt",
-    package_data={'': ['LICENSE.txt', 'data/*']},
+    package_data={'': ['LICENSE.txt', 'data/*'],
+                  'ec2stack': ['templates/*.json']},
     packages=[
         "gstack", "gstack.controllers", "gstack.models",
         "gstack.services", "gstack.data", "pyoauth2"],
@@ -56,6 +57,16 @@
         "Flask-SQLAlchemy",
         "flask",
     ],
+    classifiers=[
+        'Development Status :: 3 - Alpha',
+        'Environment :: Console',
+        'Intended Audience :: System Administrators',
+        'License :: OSI Approved :: Apache Software License',
+        'Operating System :: OS Independent',
+        'Programming Language :: Python',
+        'Topic :: Utilities',
+        'Programming Language :: Python :: 2.7',
+    ],
     zip_safe=False,
     entry_points="""
         [console_scripts]