diff --git a/src/OpenMesh/Core/Geometry/NormalConeT.cc b/src/OpenMesh/Core/Geometry/NormalConeT.cc
new file mode 100644
index 00000000..b1ccdeaa
--- /dev/null
+++ b/src/OpenMesh/Core/Geometry/NormalConeT.cc
@@ -0,0 +1,153 @@
+/*===========================================================================*\
+ * *
+ * OpenMesh *
+ * Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen *
+ * www.openmesh.org *
+ * *
+ *---------------------------------------------------------------------------*
+ * This file is part of OpenMesh. *
+ * *
+ * OpenMesh is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation, either version 3 of *
+ * the License, or (at your option) any later version with the *
+ * following exceptions: *
+ * *
+ * If other files instantiate templates or use macros *
+ * or inline functions from this file, or you compile this file and *
+ * link it with other files to produce an executable, this file does *
+ * not by itself cause the resulting executable to be covered by the *
+ * GNU Lesser General Public License. This exception does not however *
+ * invalidate any other reasons why the executable file might be *
+ * covered by the GNU Lesser General Public License. *
+ * *
+ * OpenMesh is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU LesserGeneral Public *
+ * License along with OpenMesh. If not, *
+ * see . *
+ * *
+\*===========================================================================*/
+
+/*===========================================================================*\
+ * *
+ * $Revision$ *
+ * $Date$ *
+ * *
+\*===========================================================================*/
+
+
+
+
+//=============================================================================
+//
+// CLASS NormalConeT - IMPLEMENTATION
+//
+//=============================================================================
+
+#define OPENMESH_NORMALCONE_C
+
+//== INCLUDES =================================================================
+
+#include
+#include "NormalConeT.hh"
+
+#ifdef max
+# undef max
+#endif
+
+#ifdef min
+# undef min
+#endif
+
+
+//== NAMESPACES ===============================================================
+
+
+namespace OpenMesh {
+
+
+//== IMPLEMENTATION ==========================================================
+
+template
+NormalConeT::
+NormalConeT(const Vec3& _center_normal, Scalar _angle)
+ : center_normal_(_center_normal), angle_(_angle)
+{
+}
+
+
+//----------------------------------------------------------------------------
+
+
+template
+Scalar
+NormalConeT::
+max_angle(const Vec3& _norm) const
+{
+ Scalar dotp = (center_normal_ | _norm);
+ return (dotp >= 1.0 ? 0.0 : (dotp <= -1.0 ? M_PI : acos(dotp)))
+ + angle_;
+}
+
+
+//----------------------------------------------------------------------------
+
+
+template
+Scalar
+NormalConeT::
+max_angle(const NormalConeT& _cone) const
+{
+ Scalar dotp = (center_normal_ | _cone.center_normal_);
+ Scalar centerAngle = dotp >= 1.0 ? 0.0 : (dotp <= -1.0 ? M_PI : acos(dotp));
+ Scalar sideAngle0 = std::max(angle_-centerAngle, _cone.angle_);
+ Scalar sideAngle1 = std::max(_cone.angle_-centerAngle, angle_);
+
+ return centerAngle + sideAngle0 + sideAngle1;
+}
+
+
+//----------------------------------------------------------------------------
+
+
+template
+void
+NormalConeT::
+merge(const NormalConeT& _cone)
+{
+ Scalar dotp = (center_normal_ | _cone.center_normal_);
+
+ if (fabs(dotp) < 0.99999)
+ {
+ // new angle
+ Scalar centerAngle = acos(dotp);
+ Scalar minAngle = std::min(-angle(), centerAngle - _cone.angle());
+ Scalar maxAngle = std::max( angle(), centerAngle + _cone.angle());
+ angle_ = 0.5 * (maxAngle - minAngle);
+
+ // axis by SLERP
+ Scalar axisAngle = 0.5*(minAngle + maxAngle);
+ center_normal_ = ((center_normal_ * sin(centerAngle-axisAngle)
+ + _cone.center_normal_ * sin(axisAngle))
+ / sin(centerAngle));
+ }
+ else
+ {
+ // axes point in same direction
+ if (dotp > 0.0)
+ angle_ = std::max(angle_, _cone.angle_);
+
+ // axes point in opposite directions
+ else
+ angle_ = 2*M_PI;
+ }
+}
+
+
+//=============================================================================
+} // namespace OpenMesh
+//=============================================================================
diff --git a/src/OpenMesh/Core/Geometry/NormalConeT.hh b/src/OpenMesh/Core/Geometry/NormalConeT.hh
new file mode 100644
index 00000000..b20afb1e
--- /dev/null
+++ b/src/OpenMesh/Core/Geometry/NormalConeT.hh
@@ -0,0 +1,124 @@
+/*===========================================================================*\
+ * *
+ * OpenMesh *
+ * Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen *
+ * www.openmesh.org *
+ * *
+ *---------------------------------------------------------------------------*
+ * This file is part of OpenMesh. *
+ * *
+ * OpenMesh is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation, either version 3 of *
+ * the License, or (at your option) any later version with the *
+ * following exceptions: *
+ * *
+ * If other files instantiate templates or use macros *
+ * or inline functions from this file, or you compile this file and *
+ * link it with other files to produce an executable, this file does *
+ * not by itself cause the resulting executable to be covered by the *
+ * GNU Lesser General Public License. This exception does not however *
+ * invalidate any other reasons why the executable file might be *
+ * covered by the GNU Lesser General Public License. *
+ * *
+ * OpenMesh is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU LesserGeneral Public *
+ * License along with OpenMesh. If not, *
+ * see . *
+ * *
+\*===========================================================================*/
+
+/*===========================================================================*\
+ * *
+ * $Revision$ *
+ * $Date$ *
+ * *
+\*===========================================================================*/
+
+
+
+
+//=============================================================================
+//
+// CLASS NormalCone
+//
+//=============================================================================
+
+
+#ifndef OPENMESH_NORMALCONE_HH
+#define OPENMESH_NORMALCONE_HH
+
+
+//== INCLUDES =================================================================
+
+
+#include
+
+
+//== NAMESPACES ===============================================================
+
+
+namespace OpenMesh {
+
+
+//== CLASS DEFINITION =========================================================
+
+
+/** /class NormalCone NormalCone.hh
+
+ NormalCone that can be merged with other normal cones. Provides
+ the center normal and the opening angle.
+**/
+
+template
+class NormalConeT
+{
+public:
+
+ // typedefs
+ typedef VectorT Vec3;
+
+
+ //! default constructor (not initialized)
+ NormalConeT() {}
+
+ //! Initialize cone with center (unit vector) and angle (radius in radians)
+ NormalConeT(const Vec3& _center_normal, Scalar _angle=0.0);
+
+ //! return max. distance (radians) unit vector to cone (distant side)
+ Scalar max_angle(const Vec3&) const;
+
+ //! return max. distance (radians) cone to cone (distant sides)
+ Scalar max_angle(const NormalConeT&) const;
+
+ //! merge _cone; this instance will then enclose both former cones
+ void merge(const NormalConeT&);
+
+ //! returns center normal
+ const Vec3& center_normal() const { return center_normal_; }
+
+ //! returns size of cone (radius in radians)
+ Scalar angle() const { return angle_; }
+
+private:
+
+ Vec3 center_normal_;
+ Scalar angle_;
+};
+
+
+//=============================================================================
+} // namespace OpenMesh
+//=============================================================================
+#if defined(INCLUDE_TEMPLATES) && !defined(OPENMESH_NORMALCONE_C)
+#define OPENMESH_NORMALCONE_TEMPLATES
+#include "NormalConeT.cc"
+#endif
+//=============================================================================
+#endif // OPENMESH_NORMALCONE_HH defined
+//=============================================================================
+