diff --git a/MathLib/TemplateWeightedPoint.h b/MathLib/TemplateWeightedPoint.h
new file mode 100644
index 0000000000000000000000000000000000000000..b2375e8618b51787e4faabfaec229dffed3c490d
--- /dev/null
+++ b/MathLib/TemplateWeightedPoint.h
@@ -0,0 +1,45 @@
+/**
+ * @file TemplateWeightedPoint.h
+ * @date Sep 3, 2013
+ * @brief Weighted point class.
+ *
+ * @copyright
+ * Copyright (c) 2013, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/LICENSE.txt
+ */
+
+#ifndef TEMPLATEWEIGHTEDPOINT_H_
+#define TEMPLATEWEIGHTEDPOINT_H_
+
+#include "TemplatePoint.h"
+
+namespace MathLib
+{
+
+template <typename FP_T, typename W_T, std::size_t DIM>
+class TemplateWeightedPoint : public TemplatePoint<FP_T, DIM>
+{
+public:
+	TemplateWeightedPoint(std::initializer_list<FP_T> const& list, W_T weight) :
+		TemplatePoint<FP_T, DIM>(list), _weight(weight)
+	{}
+
+	W_T getWeight() const
+	{
+		return _weight;
+	}
+
+private:
+	W_T _weight;
+};
+
+typedef TemplateWeightedPoint<double, double, 1> WeightedPoint1D;
+typedef TemplateWeightedPoint<double, double, 2> WeightedPoint2D;
+typedef TemplateWeightedPoint<double, double, 3> WeightedPoint3D;
+
+} // end namespace MathLib
+
+
+#endif /* TEMPLATEWEIGHTEDPOINT_H_ */
diff --git a/Tests/MathLib/WeightedPoint.cpp b/Tests/MathLib/WeightedPoint.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3b10a0965500b77c3c98c01430485769c3e8f7b7
--- /dev/null
+++ b/Tests/MathLib/WeightedPoint.cpp
@@ -0,0 +1,50 @@
+/**
+ * @file WeightedPoint.cpp
+ * @author Thomas Fischer
+ * @date Sep 4, 2013
+ * @brief 
+ *
+ * @copyright
+ * Copyright (c) 2013, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/LICENSE.txt
+ */
+
+// google test
+#include "gtest/gtest.h"
+
+#include "TemplateWeightedPoint.h"
+
+TEST(MathLib, WeightedPoint1D)
+{
+	double pnt = 0.5;
+	double w = 100.0;
+	MathLib::WeightedPoint1D wpnt_1d({pnt}, w);
+
+	ASSERT_NEAR(wpnt_1d[0], pnt, std::numeric_limits<double>::min());
+	ASSERT_NEAR(wpnt_1d.getWeight(), w, std::numeric_limits<double>::min());
+}
+
+TEST(MathLib, WeightedPoint2D)
+{
+	double pnt[2] = {0.1, 0.2};
+	double w = 200.0;
+	MathLib::WeightedPoint2D wpnt_2d({pnt[0], pnt[1]}, w);
+
+	ASSERT_NEAR(wpnt_2d[0], pnt[0], std::numeric_limits<double>::min());
+	ASSERT_NEAR(wpnt_2d[1], pnt[1], std::numeric_limits<double>::min());
+	ASSERT_NEAR(wpnt_2d.getWeight(), w, std::numeric_limits<double>::min());
+}
+
+TEST(MathLib, WeightedPoint3D)
+{
+	double pnt[3] = {0.1, 0.2, 0.3};
+	double w = 300.0;
+	MathLib::WeightedPoint3D wpnt_3d({pnt[0], pnt[1], pnt[2]}, w);
+
+	ASSERT_NEAR(wpnt_3d[0], pnt[0], std::numeric_limits<double>::min());
+	ASSERT_NEAR(wpnt_3d[1], pnt[1], std::numeric_limits<double>::min());
+	ASSERT_NEAR(wpnt_3d[2], pnt[2], std::numeric_limits<double>::min());
+	ASSERT_NEAR(wpnt_3d.getWeight(), w, std::numeric_limits<double>::min());
+}