diff --git a/CMakeLists.txt b/CMakeLists.txt
index ce5c8e0491ef7aa6cc1cf4b5b27139b2b23783c5..5d90ab4a174a98711d14a31c2c9fb6209da5316c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -98,6 +98,7 @@ add_subdirectory(src)
 include_directories(src)
 include_directories(src/algebra)
 include_directories(src/mesh)
+include_directories(src/output)
 include_directories(src/utils)
 include_directories(src/scheme)
 
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 67787648a4c5e3eb711c7d744f377a75228f3ad4..fcc3e886e01edf90d0aca9447099d64056d2b91c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -19,6 +19,9 @@ include_directories(mesh)
 #add_subdirectory(mesh)
 include_directories(scheme)
 
+# Pastis output
+include_directories(output)
+
 # Pastis experimental
 add_subdirectory(experimental)
 include_directories(experimental)
diff --git a/src/main.cpp b/src/main.cpp
index 697c66efcc43eb62bdd2fc68e00314d1f2dcfab2..1dc136aa5c49b1550f546621f0d9ca2bcfcfe8c4 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -16,6 +16,8 @@
 #include <BoundaryCondition.hpp>
 #include <AcousticSolver.hpp>
 
+#include <VTKWriter.hpp>
+
 #include <TinyVector.hpp>
 #include <TinyMatrix.hpp>
 
@@ -133,13 +135,16 @@ int main(int argc, char *argv[])
     timer.reset();
     MeshDataType mesh_data(mesh);
 
+
+    VTKWriter vtk_writer("output.vtu");
+
     std::vector<BoundaryConditionHandler> bc_list;
     { // quite dirty!
       for (size_t i_boundary=0; i_boundary<mesh.connectivity().numberOfNodeBoundaries(); ++i_boundary) {
 	Connectivity2D::NodesBoundary nodes_boundary = mesh.connectivity().nodesBoundary(i_boundary);
 	unsigned int ref = nodes_boundary.first;
 	TinyVector<2> normal(0,0);
-	if ((ref == 3) or (ref == 4)) {
+	if ((ref == 5) or (ref == 6)) {
 	  normal = TinyVector<2>(0,1);
 	} else {
 	  normal = TinyVector<2>(1,0);
diff --git a/src/output/VTKWriter.hpp b/src/output/VTKWriter.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..c7555bb656f4427b8af1bc75fc669d63eae5a2a8
--- /dev/null
+++ b/src/output/VTKWriter.hpp
@@ -0,0 +1,45 @@
+#ifndef VTK_WRITER_HPP
+#define VTK_WRITER_HPP
+
+#include <string>
+#include <fstream>
+
+class VTKWriter
+{
+public:
+  VTKWriter(const std::string& filename)
+  {
+    std::ofstream fout(filename);
+    fout << "<?xml version=\"1.0\"?>\n";
+    fout << "<VTKFile type=\"UnstructuredGrid\">\n";
+    fout << "<UnstructuredGrid>\n";
+    fout << "<Piece NumberOfPoints=\"3\" NumberOfCells=\"1\">\n";
+    fout << "<Points>\n";
+    fout << "<DataArray Name=\"Positions\" NumberOfComponents=\"3\" type=\"Float64\" format=\"ascii\">\n";
+    fout << "0 0 0 1 0 0 0 1 0\n";
+    fout << "</DataArray>\n";
+    fout << "</Points>\n";
+    fout << "<Cells>\n";
+    
+    fout << "<DataArray type=\"Int32\" Name=\"connectivity\" NumberOfComponents=\"1\" format=\"ascii\">\n";
+    fout << "0 1 2\n";
+    fout << "</DataArray>\n";
+
+    fout << "<DataArray type=\"UInt32\" Name=\"offsets\" NumberOfComponents=\"1\" format=\"ascii\">\n";
+    fout << 3 << '\n';
+    fout << "</DataArray>\n";
+
+    fout << "<DataArray type=\"Int8\" Name=\"types\" NumberOfComponents=\"1\" format=\"ascii\">\n";
+    fout << "5\n";
+    fout << "</DataArray>\n";
+
+    fout << "</Cells>\n";
+    fout << "</Piece>\n";
+    fout << "</UnstructuredGrid>\n";
+    fout << "</VTKFile>\n";
+  }
+
+  ~VTKWriter() = default;
+};
+
+#endif // VTK_WRITER_HPP