diff --git a/circle/dashboard/templates/dashboard/confirm/base_delete.html b/circle/dashboard/templates/dashboard/confirm/base_delete.html
new file mode 100644
index 0000000..0be4063
--- /dev/null
+++ b/circle/dashboard/templates/dashboard/confirm/base_delete.html
@@ -0,0 +1,23 @@
+{% extends "dashboard/base.html" %}
+
+{% block content %}
+  <div class="body-content">
+    <div class="panel panel-default">
+      <div class="panel-heading">
+        <h3 class="no-margin">
+          Delete confirmation
+        </h3>
+      </div>
+      <div class="panel-body">
+        Are you sure you want to delete <strong>{{ object }}</strong>?
+        <div class="pull-right">
+          <form action="" method="POST">
+            {% csrf_token %}
+            <a class="btn btn-default">Back</a>
+            <input type="hidden" name="next" value="{{ request.GET.next }}"/>
+            <button class="btn btn-danger">Yes, delete</button>
+          </form>
+        </div>
+      </div>
+  </div>
+{% endblock %}
diff --git a/circle/dashboard/urls.py b/circle/dashboard/urls.py
index 4c99110..dbd4d9a 100644
--- a/circle/dashboard/urls.py
+++ b/circle/dashboard/urls.py
@@ -3,7 +3,7 @@ from django.conf.urls import patterns, url
 from vm.models import Instance
 from .views import (
     IndexView, VmDetailView, VmList, VmCreate, TemplateDetail, AclUpdateView,
-    delete_vm, mass_delete_vm)
+    VmDelete, mass_delete_vm)
 
 urlpatterns = patterns(
     '',
@@ -17,7 +17,7 @@ urlpatterns = patterns(
     url(r'^vm/list/$', VmList.as_view(), name='dashboard.views.vm-list'),
     url(r'^vm/create/$', VmCreate.as_view(),
         name='dashboard.views.vm-create'),
-    url(r'^vm/delete/(?P<pk>\d+)/$', delete_vm,
+    url(r'^vm/delete/(?P<pk>\d+)/$', VmDelete.as_view(),
         name="dashboard.views.delete-vm"),
     url(r'^vm/mass-delete/', mass_delete_vm,
         name='dashboard.view.mass-delete-vm')
diff --git a/circle/dashboard/views.py b/circle/dashboard/views.py
index ea3c9f8..7508b9e 100644
--- a/circle/dashboard/views.py
+++ b/circle/dashboard/views.py
@@ -8,11 +8,11 @@ from django.contrib.messages import warning
 from django.core.exceptions import PermissionDenied
 from django.core import signing
 from django.core.urlresolvers import reverse, reverse_lazy
-from django.http import HttpResponse
+from django.http import HttpResponse, HttpResponseRedirect
 from django.shortcuts import redirect
 from django.views.decorators.http import require_POST
 from django.views.generic.detail import SingleObjectMixin
-from django.views.generic import TemplateView, DetailView, View
+from django.views.generic import TemplateView, DetailView, View, DeleteView
 from django.contrib import messages
 from django.utils.translation import ugettext as _
 
@@ -239,25 +239,41 @@ class VmCreate(TemplateView):
             return redirect(reverse_lazy('dashboard.views.detail', resp))
 
 
-@require_POST
-def delete_vm(request, **kwargs):
-    vm_pk = kwargs['pk']
+class VmDelete(DeleteView):
+    model = Instance
+    template_name = "dashboard/confirm/base_delete.html"
 
-    vm = Instance.objects.get(pk=vm_pk)
-    if not vm.has_level(request.user, 'owner'):
-        raise PermissionDenied()
-    vm.destroy_async()
+    def get_context_data(self, **kwargs):
+        # this is redundant now, but if we wanna add more to print
+        # we'll need this
+        context = super(VmDelete, self).get_context_data(**kwargs)
+        return context
 
-    success_message = _("VM successfully deleted!")
-    if request.is_ajax():
-        return HttpResponse(
-            json.dumps({'message': success_message}),
-            content_type="application/json",
-        )
-    else:
-        messages.success(request, success_message)
-        next = request.GET.get('next')
-        return redirect(next if next else reverse_lazy('dashboard.index'))
+    # github.com/django/django/blob/master/django/views/generic/edit.py#L245
+    def delete(self, request, *args, **kwargs):
+        object = self.get_object()
+        if not object.has_level(request.user, 'owner'):
+            raise PermissionDenied()
+
+        object.destroy_async()
+        success_url = self.get_success_url()
+        success_message = _("VM successfully deleted!")
+
+        if request.is_ajax():
+            return HttpResponse(
+                json.dumps({'message': success_message}),
+                content_type="application/json",
+            )
+        else:
+            messages.success(request, success_message)
+            return HttpResponseRedirect(success_url)
+
+    def get_success_url(self):
+        next = self.request.POST.get('next')
+        if next:
+            return next
+        else:
+            return reverse_lazy('dashboard.index')
 
 
 @require_POST