diff --git a/src/main.cpp b/src/main.cpp
index 7f0a9af86cc0402068a3ed8b9d5ee9e54a8168e6..dbf5164af581d42dbf88200a09b55900fca5fc3d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -129,9 +129,10 @@ int main(int argc, char *argv[])
 
     std::vector<BoundaryConditionHandler> bc_list;
     { // quite dirty!
-      SymmetryBoundaryCondition* sym_bc0
-	= new SymmetryBoundaryCondition(std::vector<unsigned int>({0u}));
-      std::shared_ptr<SymmetryBoundaryCondition> bc0(sym_bc0);
+      SymmetryBoundaryCondition<MeshType::dimension>* sym_bc0
+	= new SymmetryBoundaryCondition<MeshType::dimension>(std::vector<unsigned int>({0u}),
+							     TinyVector<1>(-1));
+      std::shared_ptr<SymmetryBoundaryCondition<1>> bc0(sym_bc0);
       bc_list.push_back(BoundaryConditionHandler(bc0));
 
       PressureBoundaryCondition* pres_bc1
diff --git a/src/scheme/AcousticSolver.hpp b/src/scheme/AcousticSolver.hpp
index 39ecc8b7503642fb053a7fe4773ede78b69ff3f8..0268118e4f033bf263545a6bb1c5b48d225cf2ff 100644
--- a/src/scheme/AcousticSolver.hpp
+++ b/src/scheme/AcousticSolver.hpp
@@ -174,29 +174,20 @@ private:
 	break;
       }
       case BoundaryCondition::symmetry: {
-	const SymmetryBoundaryCondition& symmetry_bc
-	  = dynamic_cast<const SymmetryBoundaryCondition&>(handler.boundaryCondition());
-	const Rdd I = identity;
-	const Kokkos::View<const unsigned int**> face_cells
-	  = m_connectivity.faceCells();
-	const Kokkos::View<const unsigned short**> face_cell_local_face
-	  = m_connectivity.faceCellLocalFace();
-	const Kokkos::View<const Rd**> njr
-	  = m_mesh_data.njr();
+	const SymmetryBoundaryCondition<dimension>& symmetry_bc
+	  = dynamic_cast<const SymmetryBoundaryCondition<dimension>&>(handler.boundaryCondition());
 
-	Kokkos::parallel_for(symmetry_bc.numberOfFaces(), KOKKOS_LAMBDA(const int& l_number) {
-	    // quite ugly: node/faces are melt in a bad way... at least works in 1d...
-	    const int l = symmetry_bc.faceList()[l_number];
-	    assert(m_connectivity.faceNbCells() == 1);
-	    const unsigned int j = face_cells(l,0);
-	    const unsigned int L = face_cell_local_face(l,0);
+	const Rd& n = symmetry_bc.outgoingNormal();
+	const Rdd I = identity;
+	const Rdd nxn = tensorProduct(n,n);
+	const Rdd P = I-nxn;
 
-	    const Rd& n = njr(j,L);
-	    const Rdd nxn = tensorProduct(n,n);
-	    const Rdd P = I-nxn;
+	Kokkos::parallel_for(symmetry_bc.numberOfNodes(), KOKKOS_LAMBDA(const int& r_number) {
+	    const int r = symmetry_bc.nodeList()[r_number];
+	    assert(m_connectivity.nodeNbCells() == 1);
 
-	    m_Ar(l) = P*m_Ar(l)*P + nxn;
-	    m_br(l) = P*m_br(l);
+	    m_Ar(r) = P*m_Ar(r)*P + nxn;
+	    m_br(r) = P*m_br(r);
 	  });
 	break;
       }
diff --git a/src/scheme/BoundaryCondition.hpp b/src/scheme/BoundaryCondition.hpp
index 80a7ea0fc95a43fcdb61736a201c53f591cb7d50..83f5fb3443571d293cf34fc77e55dc857eb8efb5 100644
--- a/src/scheme/BoundaryCondition.hpp
+++ b/src/scheme/BoundaryCondition.hpp
@@ -72,31 +72,39 @@ public:
   ~PressureBoundaryCondition() = default;
 };
 
+template <size_t dimension>
 class SymmetryBoundaryCondition
   : public BoundaryCondition
 {
-private:
-  const size_t m_number_of_faces;
-  Kokkos::View<unsigned int*> m_face_list;
+public:
+  typedef TinyVector<dimension, double> Rd;
 
+private:
+  Kokkos::View<unsigned int*> m_node_list;
+  const Rd m_outgoing_normal;
 public:
-  const size_t& numberOfFaces() const
+  const Rd& outgoingNormal() const
   {
-    return m_number_of_faces;
+    return m_outgoing_normal;
+  }
+  size_t numberOfNodes() const
+  {
+    return m_node_list.size();
   }
 
-  const Kokkos::View<const unsigned int*> faceList() const
+  const Kokkos::View<const unsigned int*> nodeList() const
   {
-    return m_face_list;
+    return m_node_list;
   }
 
-  SymmetryBoundaryCondition(const std::vector<unsigned int>& faces)
+  SymmetryBoundaryCondition(const std::vector<unsigned int>& nodes,
+			    const Rd& outgoing_normal)
     : BoundaryCondition(BoundaryCondition::symmetry),
-      m_number_of_faces(faces.size()),
-      m_face_list("faces_list", m_number_of_faces)
+      m_node_list("node_list", nodes.size()),
+      m_outgoing_normal(outgoing_normal)
   {
-    Kokkos::parallel_for(m_number_of_faces, KOKKOS_LAMBDA(const int& f){
-	m_face_list[f]=faces[f];
+    Kokkos::parallel_for(m_node_list.size(), KOKKOS_LAMBDA(const int& f){
+	m_node_list[f]=nodes[f];
       });
   }