diff --git a/rolehandler/templates/modal/role_create.html b/rolehandler/templates/modal/role_create.html
index 58d68ca..d8282a7 100644
--- a/rolehandler/templates/modal/role_create.html
+++ b/rolehandler/templates/modal/role_create.html
@@ -17,9 +17,22 @@
                             <input class="form-control" id="rolename" name="name"
                                    placeholder="Name" required>
                         </div>
+                       
                     </div>
-
-            
+                    <div class="form-group">
+                        <div class="col-sm-6">
+                                <div class="checkbox">
+                                        <label><input type="checkbox" id="create_root" name="root"> Root</label>
+                                    </div>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="definition" class="col-sm-3 control-label">Definition </label>
+                        <div class="col-sm-6">
+                            <textarea class="form-control" id="definition" name="definition" placeholder="Yaml definition"
+                                      rows="3"></textarea>
+                        </div>
+                    </div>
 
                 </div>
                 <div class="modal-footer">
diff --git a/rolehandler/templates/modal/role_edit.html b/rolehandler/templates/modal/role_edit.html
index 8541177..ca3c4c0 100644
--- a/rolehandler/templates/modal/role_edit.html
+++ b/rolehandler/templates/modal/role_edit.html
@@ -14,10 +14,26 @@
                 <div class="modal-body" id="modal_edit_role_body">
                     
                     <div class="form-group">
-                        <label for="name" class="col-sm-3 control-label">Name</label>
+                        <label for="rolename" class="col-sm-3 control-label">Name *</label>
                         <div class="col-sm-6">
-                           <input class="form-control" id="edit_role_name" name="role" 
-                                   placeholder="Name">
+                            <input class="form-control" type="text" id="edit_rolename" name="name"
+                                       placeholder="Name" required>
+                        </div>
+                        
+                    </div>
+                    <div class="form-group">
+                            <div class="col-sm-6">
+                                    <div class="checkbox">
+                                            <label><input type="checkbox" id="edit_root" name="root"> Root</label>
+                                        </div>
+                            </div>
+                        </div>
+                        
+                    <div class="form-group">
+                        <label for="definition" class="col-sm-3 control-label">Definition </label>
+                        <div class="col-sm-6">
+                            <textarea class="form-control" id="edit_definition" name="definition" placeholder="Yaml definition"
+                                      rows="3"></textarea>
                         </div>
                     </div>
                    
diff --git a/rolehandler/templates/role_list.html b/rolehandler/templates/role_list.html
index 5cf49a1..bfc7566 100644
--- a/rolehandler/templates/role_list.html
+++ b/rolehandler/templates/role_list.html
@@ -19,7 +19,7 @@
 
 {% block breadcrumb_body %}
     {{ block.super }}
-    <li><a href="#">roles</a></li>
+    <li><a href="#">Roles</a></li>
 {% endblock %}
 
 {% block content_body %}
@@ -33,10 +33,10 @@
 
             <div class="box">
                 <div class="box-header with-border">
-                    <h3 class="box-title">roles</h3>
+                    <h3 class="box-title">Roles</h3>
                     <div class="box-tools">
                         <button type="button" class="btn btn-default" data-container="body"
-                                onclick="javascript:openModalCreateRole({'projects_list_url': '{% url "projects:projects_list" %}'})"
+                                onclick="javascript:openModalCreateRole()"
                                 data-toggle="tooltip" data-placement="top" title="New role">
 
                             <i class="fa fa-plus"></i> Create role
@@ -128,9 +128,9 @@
                                 'data-toggle="dropdown" aria-expanded="false">Actions ' +
                                 '<span class="fa fa-caret-down"></span></button> ' +
                                 '<ul class="dropdown-menu">' +
-                                '<li> <a href="#" onclick="javascript:openModalEditRole({role_id:\'' + row['_id'] + '\', rolename:\'' + row['rolename'] + '\'})">' +
+                                '<li> <a href="#" onclick="javascript:openModalEditRole({role_id:\'' + row['_id'] + '\'})">' +
                                 '<i class="fa fa-edit"></i> Edit</a></li>' +
-                                '<li> <a href="#" onclick="javascript:deleteRole(\'' + row['_id'] + '\', \'' + row['rolename'] + '\')"' +
+                                '<li> <a href="#" onclick="javascript:deleteRole(\'' + row['_id'] + '\', \'' + row['name'] + '\')"' +
                                 'style="color:red"><i class="fa fa-trash"></i> Delete</a></li> </ul></div>';
                         },
                         "targets": 4,
@@ -197,7 +197,7 @@
                     table.ajax.reload();
                     bootbox.alert({
                         title: "Result",
-                        message: "role successfully modified."
+                        message: "Role successfully modified."
                     });
 
                 }).fail(function (result) {
diff --git a/rolehandler/urls.py b/rolehandler/urls.py
index c37325d..64d7ab1 100644
--- a/rolehandler/urls.py
+++ b/rolehandler/urls.py
@@ -20,7 +20,8 @@
 urlpatterns = [
     url(r'^list$', views.role_list, name='list'),
     url(r'^create$', views.create, name='create'),
-    url(r'^(?P<user_id>[0-9a-zA-Z]+)/delete$', views.delete, name='delete'),
-    url(r'^(?P<user_id>[0-9a-zA-Z]+)', views.update, name='update')
+    url(r'^(?P<role_id>[0-9a-zA-Z]+)/delete$', views.delete, name='delete'),
+    url(r'^(?P<role_id>[0-9a-zA-Z]+)/update$', views.update, name='update'),
+    url(r'^(?P<role_id>[0-9a-zA-Z]+)$', views.get, name='get')
 
 ]
diff --git a/rolehandler/views.py b/rolehandler/views.py
index f6a0799..a13e28d 100644
--- a/rolehandler/views.py
+++ b/rolehandler/views.py
@@ -17,6 +17,7 @@
 from django.shortcuts import render, redirect
 from sf_t3d.decorators import login_required
 from django.http import HttpResponse
+import yaml
 import json
 import logging
 import authosm.utils as osmutils
@@ -42,8 +43,21 @@
     user = osmutils.get_user(request)
     client = Client()
     role_data ={
-       'name'
+       'name': request.POST['name'],
+       'root': True if request.POST.get('root') else False
     }
+    try:
+        if 'definition' in request.POST and request.POST.get('definition') != '':
+            role_definition = yaml.load(request.POST.get('definition'))
+
+            if not isinstance(role_definition, dict):
+                    raise ValueError('Role definition should be provided in a key-value fashion')
+            for key, value in role_definition.items():
+                if not isinstance(value, bool):
+                    raise ValueError('Value in a role definition should be boolean')
+                role_data[key] = value
+    except Exception as e:
+        return __response_handler(request, {'status': 400, 'code': 'BAD_REQUEST', 'detail': e.message} , url=None, status=400)
     result = client.role_create(user.get_token(), role_data)
     if result['error']:
         return __response_handler(request, result['data'], url=None,
@@ -70,21 +84,53 @@
 @login_required
 def update(request, role_id=None):
     user = osmutils.get_user(request)
+    client = Client()
+    payload = {
+        '_id': role_id,
+        'name': request.POST['name'],
+        'root': True if request.POST.get('root') else False
+    }
     try:
-        client = Client()
-        payload = {}
-        if request.POST.get('name') and request.POST.get('name') is not '':
-            payload["name"] = request.POST.get('name')
-        update_res = client.role_update(user.get_token(), role_id, payload)
+        if 'definition' in request.POST and request.POST.get('definition') != '':
+            role_definition = yaml.load(request.POST.get('definition'))
+
+            if not isinstance(role_definition, dict):
+                    raise ValueError('Role definition should be provided in a key-value fashion')
+            for key, value in role_definition.items():
+                if not isinstance(value, bool):
+                    raise ValueError('Value in a role definition should be boolean')
+                payload[key] = value
     except Exception as e:
-        log.exception(e)
-        update_res = {'error': True, 'data': str(e)}
-    if update_res['error']:
-        return __response_handler(request, update_res['data'], url=None,
-                                  status=update_res['data']['status'] if 'status' in update_res['data'] else 500)
+        return __response_handler(request, {'status': 400, 'code': 'BAD_REQUEST', 'detail': e.message} , url=None, status=400)
+    result = client.role_update(user.get_token(), role_id, payload)
+    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(request, role_id=None):
+    user = osmutils.get_user(request)
+    try:
+        client = Client()
+        get_res = client.role_get(user.get_token(), role_id)
+    except Exception as e:
+        log.exception(e)
+        get_res = {'error': True, 'data': str(e)}
+    if get_res['error']:
+        return __response_handler(request, get_res['data'], url=None,
+                                  status=get_res['data']['status'] if 'status' in get_res['data'] else 500)
+    else:
+        role = get_res['data']
+        result = {
+            '_id': role['_id'],
+            'name': role['name'],
+            'root': role['root'],
+            'definition': { key:value for key, value in role.items() if key not in ['_id', 'name', 'root', '_admin'] }
+        }
+        return __response_handler(request, result, url=None, status=200)
+
 
 def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
     raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
