diff --git a/libpwrutils/CMakeLists.txt b/libpwrutils/CMakeLists.txt
index 515e79b14f21f9eaebc25e3c712c68d41c26fde9..56f110ea44f1f9bee4c456346843ec2e55b68417 100644
--- a/libpwrutils/CMakeLists.txt
+++ b/libpwrutils/CMakeLists.txt
@@ -29,6 +29,7 @@ SET(libpwrutils_STAT_SRC
 	exception.cpp
 	whitespace.cpp
 	pathsearch.cpp
+	plural.cpp
 	util.cpp
 )
 
diff --git a/libpwrutils/plural.cpp b/libpwrutils/plural.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..092f5c721c2951f03ac12cc5a8a59c1a88223853
--- /dev/null
+++ b/libpwrutils/plural.cpp
@@ -0,0 +1,80 @@
+/*
+    Copyright (C) 2010 Tomasz Åšniatowski, Adam Radziszewski
+
+    This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3 of the License, or (at your option)
+any later version.
+
+    This program 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 LICENSE and COPYING files for more details.
+*/
+
+#include <libpwrutils/plural.h>
+#include <sstream>
+
+namespace PwrNlp {
+
+std::string enpl(int amount, const std::string& sg)
+{
+	if (amount == 1) {
+		return sg;
+	} else {
+		return sg + "s";
+	}
+}
+
+std::string enpln(int amount, const std::string& sg)
+{
+	std::stringstream ss;
+	ss << amount << " " << enpl(amount, sg);
+	return ss.str();
+}
+
+std::string enpl(int amount, const std::string& sg, const std::string& pl)
+{
+	if (amount == 1) {
+		return sg;
+	} else {
+		return pl;
+	}
+}
+
+std::string enpln(int amount, const std::string& sg, const std::string& pl)
+{
+	std::stringstream ss;
+	ss << amount << " " << enpl(amount, sg, pl);
+	return ss.str();
+}
+
+
+std::string plpl(int amount, const std::string& gen0, const std::string& nom1, const std::string& acc2)
+{
+	if (amount == 1) {
+		return nom1;
+	} else {
+		amount %= 100;
+		if (amount > 10 && amount < 20) {
+			return gen0;
+		} else {
+			amount %= 10;
+			if (amount == 2 || amount == 3 || amount == 4) {
+				return acc2;
+			} else {
+				return gen0;
+			}
+		}
+	}
+}
+
+std::string plpln(int amount, const std::string& gen0, const std::string& nom1, const std::string& acc2)
+{
+	std::stringstream ss;
+	ss << amount << " " << plpl(amount, gen0, nom1, acc2);
+	return ss.str();
+}
+
+} /* end namespace PwrNlp */
diff --git a/libpwrutils/plural.h b/libpwrutils/plural.h
new file mode 100644
index 0000000000000000000000000000000000000000..17a0ab6c46b4426712b8d0266ae2eaf8dc59602b
--- /dev/null
+++ b/libpwrutils/plural.h
@@ -0,0 +1,43 @@
+/*
+    Copyright (C) 2010 Tomasz Åšniatowski, Adam Radziszewski
+
+    This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3 of the License, or (at your option)
+any later version.
+
+    This program 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 LICENSE and COPYING files for more details.
+*/
+
+#ifndef PWRNLP_PLURAL_H
+#define PWRNLP_PLURAL_H
+
+#include <string>
+
+namespace PwrNlp {
+
+/// Pluralize sg according to amount, regular English plural
+std::string enpl(int amount, const std::string& sg);
+
+/// Pluralize (English), output the number and the pluralized word
+std::string enpln(int amount, const std::string& sg);
+
+/// Pluralize according to amount, custom English-style plural
+std::string enpl(int amount, const std::string& sg, const std::string& pl);
+
+/// Pluralize (English), output the number and the pluralized word
+std::string enpln(int amount, const std::string& sg, const std::string& pl);
+
+/// Pluralize according to amount, Polish plural
+std::string plpl(int amount, const std::string& gen0, const std::string& nom1, const std::string& acc2);
+
+/// Pluralize (Polish) output the number and the pluralized word
+std::string plpln(int amount, const std::string& gen0, const std::string& nom1, const std::string& acc2);
+
+} /* end ns PwrNlp */
+
+#endif // PWRNLP_PATHSEARCH_H