diff --git a/circle/dashboard/urls.py b/circle/dashboard/urls.py
index 09924f9..4463849 100644
--- a/circle/dashboard/urls.py
+++ b/circle/dashboard/urls.py
@@ -5,9 +5,9 @@ from .views import (
     AclUpdateView, DiskAddView, FavouriteView, GroupAclUpdateView, GroupDelete,
     GroupDetailView, GroupList, GroupUserDelete, IndexView, LeaseCreate,
     LeaseDelete, LeaseDetail, NodeAddTraitView, NodeCreate, NodeDelete,
-    NodeDetailView, NodeGraphView, NodeList, NodeStatus, NotificationView,
-    PortDelete, TemplateAclUpdateView, TemplateCreate, TemplateDelete,
-    TemplateDetail, TemplateList, TransferOwnershipConfirmView,
+    NodeDetailView, NodeGraphView, NodeList, NodeStatus, NodeFlushView,
+    NotificationView, PortDelete, TemplateAclUpdateView, TemplateCreate,
+    TemplateDelete, TemplateDetail, TemplateList, TransferOwnershipConfirmView,
     TransferOwnershipView, vm_activity, VmCreate, VmDelete, VmDetailView,
     VmDetailVncTokenView, VmGraphView, VmList, VmMassDelete, VmMigrateView,
     VmRenewView,
@@ -68,6 +68,8 @@ urlpatterns = patterns(
         name="dashboard.views.delete-node"),
     url(r'^node/status/(?P<pk>\d+)/$', NodeStatus.as_view(),
         name="dashboard.views.status-node"),
+    url(r'^node/flush/(?P<pk>\d+)/$', NodeFlushView.as_view(),
+        name="dashboard.views.flush-node"),
     url(r'^node/create/$', NodeCreate.as_view(),
         name='dashboard.views.node-create'),
 
diff --git a/circle/dashboard/views.py b/circle/dashboard/views.py
index ee0d749..3750b4e 100644
--- a/circle/dashboard/views.py
+++ b/circle/dashboard/views.py
@@ -1413,6 +1413,53 @@ class NodeStatus(LoginRequiredMixin, SuperuserRequiredMixin, DetailView):
             return redirect(self.get_success_url())
 
 
+class NodeFlushView(LoginRequiredMixin, SuperuserRequiredMixin, DetailView):
+    template_name = "dashboard/confirm/node-flush.html"
+    model = Node
+
+    def get_template_names(self):
+        if self.request.is_ajax():
+            return ['dashboard/confirm/ajax-node-flush.html']
+        else:
+            return ['dashboard/confirm/node-flush.html']
+
+    def get_success_url(self):
+        next = self.request.GET.get('next')
+        if next:
+            return next
+        else:
+            return reverse_lazy("dashboard.views.node-detail",
+                                kwargs={'pk': self.object.pk})
+
+    def get_context_data(self, **kwargs):
+        context = super(NodeFlushView, self).get_context_data(**kwargs)
+        return context
+
+    def post(self, request, *args, **kwargs):
+        if request.POST.get('flush') is not None:
+            return self.__flush(request)
+        return redirect(reverse_lazy("dashboard.views.node-detail",
+                                     kwargs={'pk': self.get_object().pk}))
+
+    def __flush(self, request):
+        self.object = self.get_object()
+        self.object.flush_async(user=request.user)
+        success_message = _("Node successfully flushed!")
+
+        if request.is_ajax():
+            response = {
+                'message': success_message,
+                'node_pk': self.object.pk
+            }
+            return HttpResponse(
+                json.dumps(response),
+                content_type="application/json"
+            )
+        else:
+            messages.success(request, success_message)
+            return redirect(self.get_success_url())
+
+
 class PortDelete(LoginRequiredMixin, DeleteView):
     model = Rule
     pk_url_kwarg = 'rule'