diff --git a/src/blackberry10/native/device/libGlobalization.so b/src/blackberry10/native/device/libGlobalization.so
index 9d82ee4..bfbf28e 100755
--- a/src/blackberry10/native/device/libGlobalization.so
+++ b/src/blackberry10/native/device/libGlobalization.so
Binary files differ
diff --git a/src/blackberry10/native/simulator/libGlobalization.so b/src/blackberry10/native/simulator/libGlobalization.so
index 01f7a68..ceddb56 100755
--- a/src/blackberry10/native/simulator/libGlobalization.so
+++ b/src/blackberry10/native/simulator/libGlobalization.so
Binary files differ
diff --git a/src/blackberry10/native/src/globalization_js.cpp b/src/blackberry10/native/src/globalization_js.cpp
index 3bf0589..567b90d 100644
--- a/src/blackberry10/native/src/globalization_js.cpp
+++ b/src/blackberry10/native/src/globalization_js.cpp
@@ -13,51 +13,11 @@
  */
 
 #include <string>
-#include <sys/slog2.h>
 #include "globalization_js.hpp"
 #include "globalization_ndk.hpp"
 
 using namespace std;
 
-// This can be any 16 bit integer value. It is used only for our own
-// logs identification when calling slog2f().
-const unsigned short ID_G11N = 22549;
-
-void setupLogging()
-{
-    static bool inited = false;
-
-    if (inited)
-        return;
-
-    inited = true;
-
-    // Reset the log buffers in case this is after a fork. (If there were no log buffers, this does
-    // nothing.)
-    int rc = slog2_reset();
-    if (rc < 0) {
-        fprintf(stderr, "Globalization: Error resetting slog2 buffer!\n");
-        return;
-    }
-
-    // Set up default slog2 buffer
-    slog2_buffer_set_config_t bufferConfigSet;
-    bufferConfigSet.buffer_set_name = "Globalization";
-    bufferConfigSet.num_buffers = 1;
-    bufferConfigSet.verbosity_level = SLOG2_INFO;
-    bufferConfigSet.buffer_config[0].buffer_name = "default";
-    bufferConfigSet.buffer_config[0].num_pages = 8;
-
-    slog2_buffer_t bufferHandle;
-    rc = slog2_register(&bufferConfigSet, &bufferHandle, 0);
-    if (rc < 0) {
-        fprintf(stderr, "Globalization: Error registering slogger2 buffer!\n");
-        return;
-    }
-
-    slog2_set_default_buffer(bufferHandle);
-}
-
 /**
  * Default constructor.
  */
@@ -88,11 +48,6 @@
  * an object is created on the JavaScript server side.
  */
 JSExt* onCreateObject(const string& className, const string& id) {
-	setupLogging();
-
-	slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationJS::onCreateObject(%s, %s)",
-			className.c_str(), id.c_str());
-
 	if (className == "Globalization") {
 		return new GlobalizationJS(id);
 	}
@@ -114,8 +69,6 @@
  * called on the JavaScript side with this native objects id.
  */
 string GlobalizationJS::InvokeMethod(const string& command) {
-	slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationJS::InvokeMethod(%s)", command.c_str());
-
 	// format must be: "command callbackId params"
 	size_t commandIndex = command.find_first_of(" ");
 	std::string strCommand = command.substr(0, commandIndex);
diff --git a/src/blackberry10/native/src/globalization_js.hpp b/src/blackberry10/native/src/globalization_js.hpp
index 2cfed2a..7c4c696 100644
--- a/src/blackberry10/native/src/globalization_js.hpp
+++ b/src/blackberry10/native/src/globalization_js.hpp
@@ -19,8 +19,6 @@
 #include "../public/plugin.h"
 #include "globalization_ndk.hpp"
 
-extern const unsigned short ID_G11N;
-
 class GlobalizationJS: public JSExt {
 
 public:
diff --git a/src/blackberry10/native/src/globalization_ndk.cpp b/src/blackberry10/native/src/globalization_ndk.cpp
index 9706595..86f3c1f 100644
--- a/src/blackberry10/native/src/globalization_ndk.cpp
+++ b/src/blackberry10/native/src/globalization_ndk.cpp
@@ -20,7 +20,6 @@
 #include <string>
 #include <json/reader.h>
 #include <json/writer.h>
-#include <sys/slog2.h>
 #include <unicode/calendar.h>
 #include <unicode/datefmt.h>
 #include <unicode/decimfmt.h>
@@ -95,16 +94,12 @@
     UErrorCode status = U_ZERO_ERROR;
     Calendar* cal = Calendar::createInstance(status);
     if (!cal) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::resultInJson: failed to create Calendar instance: %d",
-                status);
         return errorInJson(UNKNOWN_ERROR, "Failed to create Calendar instance!");
     }
     std::auto_ptr<Calendar> deleter(cal);
 
     cal->setTime(date, status);
     if (status != U_ZERO_ERROR && status != U_ERROR_WARNING_START) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::resultInJson: failed to setTime: %d",
-                status);
         return errorInJson(UNKNOWN_ERROR, "Failed to set Calendar time!");
     }
 
@@ -217,7 +212,6 @@
     static const char* langfile = "/pps/services/confstr/_CS_LOCALE";
     int fd = ::open(langfile, O_RDONLY);
     if (fd < 0) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::readLanguageFromPPS: unable to open PPS file: %s.", langfile);
         return std::string();
     }
 
@@ -227,7 +221,6 @@
     ::close(fd);
 
     if (read <= 0) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::readLanguageFromPPS: unable to read PPS file: %s.", langfile);
         return std::string();
     }
 
@@ -235,7 +228,6 @@
     size_t pos = content.find_first_of("::");
 
     if (pos == std::string::npos) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::readLanguageFromPPS: unable to find signature \"_CS_LOCALE::\" in PPS file: %s.", langfile);
         return std::string();
     }
 
@@ -252,13 +244,11 @@
 
     const char* lang = loc.getLanguage();
     if (!lang || !strlen(lang)) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getPreferredLanguage: no language for current locale! Use \"en\" instead.");
         lang = "en";
     }
 
     const char* country = loc.getCountry();
     if (!country || !strlen(country)) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getPreferredLanguage: no country for current locale! Use \"US\" instead.");
         country = "US";
     }
 
@@ -271,13 +261,11 @@
 
     const char* lang = loc.getLanguage();
     if (!lang) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getLocaleName: no language for current locale! Use \"en\" instead.");
         lang = "en";
     }
 
     const char* country = loc.getCountry();
     if (!country) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getLocaleName: no country for current locale! Use \"US\" instead.");
         country = "US";
     }
 
@@ -294,8 +282,6 @@
         return true;
 
     if (!options.isObject()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleDateOptions: invalid options format: %d",
-                options.type());
         error = "Options is invalid!";
         return false;
     }
@@ -303,15 +289,12 @@
     Json::Value flv = options["formatLength"];
     if (!flv.isNull()) {
         if (!flv.isString()) {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleDateOptions: invalid formatLength format: %d",
-                    flv.type());
             error = "formatLength is invalid!";
             return false;
         }
 
         std::string format = flv.asString();
         if (format.empty()) {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleDateOptions: empty formatLength!");
             error = "formatLength is empty!";
             return false;
         }
@@ -328,8 +311,6 @@
         } else if (format == "short") {
             // Nothing to change here.
         } else {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleDateOptions: unsupported formatLength: %s",
-                    format.c_str());
             error = "Unsupported formatLength!";
             return false;
         }
@@ -338,15 +319,12 @@
     Json::Value slv = options["selector"];
     if (!slv.isNull()) {
         if (!slv.isString()) {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleDateOptions: invalid selector format: %d",
-                    slv.type());
             error = "selector is invalid!";
             return false;
         }
 
         std::string selector = slv.asString();
         if (selector.empty()) {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleDateOptions: empty selector!");
             error = "selector is empty!";
             return false;
         }
@@ -359,8 +337,6 @@
         else if (selector == "date and time") {
             // Nothing to do here.
         } else {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleDateOptions: unsupported selector: %s",
-                    selector.c_str());
             error = "Unsupported selector!";
             return false;
         }
@@ -379,20 +355,15 @@
     bool parse = reader.parse(args, root);
 
     if (!parse) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::dateToString: invalid json data: %s",
-                args.c_str());
         return errorInJson(PARSING_ERROR, "Parameters not valid json format!");
     }
 
     Json::Value date = root["date"];
     if (date.isNull()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::dateToString: no date provided.");
         return errorInJson(PARSING_ERROR, "No date provided!");
     }
 
     if (!date.isNumeric()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::dateToString: date is not a numeric: %d.",
-                date.type());
         return errorInJson(PARSING_ERROR, "Date in wrong format!");
     }
 
@@ -409,7 +380,6 @@
     DateFormat* df = DateFormat::createDateTimeInstance(dstyle, tstyle, loc);
 
     if (!df) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::dateToString: unable to create DateFormat!");
         return errorInJson(UNKNOWN_ERROR, "Unable to create DateFormat instance!");
     }
     std::auto_ptr<DateFormat> deleter(df);
@@ -432,21 +402,16 @@
     bool parse = reader.parse(args, root);
 
     if (!parse) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToDate: invalid json data: %s",
-                args.c_str());
         return errorInJson(PARSING_ERROR, "Parameters not valid json format!");
     }
 
     Json::Value dateString = root["dateString"];
     if (!dateString.isString()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToDate: invalid dateString type: %d",
-                dateString.type());
         return errorInJson(PARSING_ERROR, "dateString not a string!");
     }
 
     std::string dateValue = dateString.asString();
     if (dateValue.empty()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToDate: empty dateString.");
         return errorInJson(PARSING_ERROR, "dateString is empty!");
     }
 
@@ -461,7 +426,6 @@
     DateFormat* df = DateFormat::createDateTimeInstance(dstyle, tstyle, loc);
 
     if (!df) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToDate: unable to create DateFormat instance!");
         return errorInJson(UNKNOWN_ERROR, "Unable to create DateFormat instance!");
     }
     std::auto_ptr<DateFormat> deleter(df);
@@ -472,8 +436,6 @@
 
     // Note: not sure why U_ERROR_WARNING_START is returned when parse succeeded.
     if (status != U_ZERO_ERROR && status != U_ERROR_WARNING_START) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToDate: DataFormat::parse error: %d: %s",
-                status, dateValue.c_str());
         return errorInJson(PARSING_ERROR, "Failed to parse dateString!");
     }
 
@@ -490,8 +452,6 @@
         bool parse = reader.parse(args, root);
 
         if (!parse) {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getDatePattern: invalid json data: %s",
-                    args.c_str());
             return errorInJson(PARSING_ERROR, "Parameters not valid json format!");
         }
 
@@ -507,13 +467,11 @@
     DateFormat* df = DateFormat::createDateTimeInstance(dstyle, tstyle, loc);
 
     if (!df) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getDatePattern: unable to create DateFormat instance!");
         return errorInJson(UNKNOWN_ERROR, "Unable to create DateFormat instance!");
     }
     std::auto_ptr<DateFormat> deleter(df);
 
     if (df->getDynamicClassID() != SimpleDateFormat::getStaticClassID()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getDatePattern: DateFormat instance not SimpleDateFormat!");
         return errorInJson(UNKNOWN_ERROR, "DateFormat instance not SimpleDateFormat!");
     }
 
@@ -559,8 +517,6 @@
         return true;
 
     if (!options.isObject()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleNamesOptions: invalid options format: %d",
-                options.type());
         error = "Options is invalid!";
         return false;
     }
@@ -568,15 +524,12 @@
     Json::Value tv = options["type"];
     if (!tv.isNull()) {
         if (!tv.isString()) {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleNamesOptions: invalid type format: %d",
-                    tv.type());
             error = "type is invalid!";
             return false;
         }
 
         std::string tstr = tv.asString();
         if (tstr.empty()) {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleNamesOptions: empty type!");
             error = "type is empty!";
             return false;
         }
@@ -586,8 +539,6 @@
         } else if (tstr == "wide") {
             // Nothing to change here.
         } else {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleNamesOptions: unsupported type: %s",
-                    tstr.c_str());
             error = "Unsupported type!";
             return false;
         }
@@ -596,15 +547,12 @@
     Json::Value iv = options["item"];
     if (!iv.isNull()) {
         if (!iv.isString()) {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleNamesOptions: invalid item format: %d",
-                    iv.type());
             error = "item is invalid!";
             return false;
         }
 
         std::string istr = iv.asString();
         if (istr.empty()) {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleNamesOptions: empty item!");
             error = "item is empty!";
             return false;
         }
@@ -614,8 +562,6 @@
         } else if (istr == "months") {
             // Nothing to change here.
         } else {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleNamesOptions: unsupported item: %s",
-                    istr.c_str());
             error = "Unsupported item!";
             return false;
         }
@@ -635,8 +581,6 @@
         bool parse = reader.parse(args, root);
 
         if (!parse) {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getDateNames: invalid json data: %s",
-                    args.c_str());
             return errorInJson(PARSING_ERROR, "Parameters not valid json format!");
         }
 
@@ -678,13 +622,11 @@
     DateFormat* df = DateFormat::createDateInstance(dstyle, loc);
 
     if (!df) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getDateNames: unable to create DateFormat instance!");
         return errorInJson(UNKNOWN_ERROR, "Unable to create DateFormat instance!");
     }
     std::auto_ptr<DateFormat> deleter(df);
 
     if (df->getDynamicClassID() != SimpleDateFormat::getStaticClassID()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getDateNames: DateFormat instance not SimpleDateFormat!");
         return errorInJson(UNKNOWN_ERROR, "DateFormat instance not SimpleDateFormat!");
     }
 
@@ -693,16 +635,12 @@
 
     Calendar* cal = Calendar::createInstance(status);
     if (!cal) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getDateNames: unable to create Calendar instance: %x.",
-                status);
         return errorInJson(UNKNOWN_ERROR, "Unable to create Calendar instance!");
     }
     std::auto_ptr<Calendar> caldeleter(cal);
 
     UCalendarDaysOfWeek ud = cal->getFirstDayOfWeek(status);
     if (status != U_ZERO_ERROR && status != U_ERROR_WARNING_START) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getDateNames: failed to getFirstDayOfWeek: %d!",
-                status);
         return errorInJson(PARSING_ERROR, "Failed to getFirstDayOfWeek!");
     }
 
@@ -731,8 +669,6 @@
     }
 
     if (!utf8Names.size()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getDateNames: unable to get symbols: item: %d, type: %d.",
-                item, type);
         return errorInJson(UNKNOWN_ERROR, "Unable to get symbols!");
     }
 
@@ -742,7 +678,6 @@
 std::string GlobalizationNDK::isDayLightSavingsTime(const std::string& args)
 {
     if (args.empty()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::isDayLightSavingsTime: no date provided.");
         return errorInJson(UNKNOWN_ERROR, "No date is provided!");
     }
 
@@ -751,16 +686,12 @@
     bool parse = reader.parse(args, root);
 
     if (!parse) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::isDayLightSavingsTime: invalid json data: %s",
-                args.c_str());
         return errorInJson(PARSING_ERROR, "Parameters not valid json format!");
     }
 
     Json::Value dv = root["date"];
 
     if (!dv.isNumeric()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::isDayLightSavingsTime: invalid date format: %d",
-                dv.type());
         return errorInJson(PARSING_ERROR, "Invalid date format!");
     }
 
@@ -769,8 +700,6 @@
     UErrorCode status = U_ZERO_ERROR;
     SimpleDateFormat* sdf = new SimpleDateFormat(status);
     if (!sdf) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::isDayLightSavingsTime: unable to create SimpleDateFormat instance: %d.",
-                status);
         return errorInJson(UNKNOWN_ERROR, "Unable to create SimpleDateFormat instance!");
     }
 
@@ -785,15 +714,11 @@
     UErrorCode status = U_ZERO_ERROR;
     Calendar* cal = Calendar::createInstance(status);
     if (!cal) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getFirstDayOfWeek: failed to create Calendar instance: %d",
-                status);
         return errorInJson(UNKNOWN_ERROR, "Failed to create Calendar instance!");
     }
 
     UCalendarDaysOfWeek d = cal->getFirstDayOfWeek(status);
     if (status != U_ZERO_ERROR && status != U_ERROR_WARNING_START) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getFirstDayOfWeek: failed to call getFirstDayOfWeek: %d",
-                status);
         return errorInJson(UNKNOWN_ERROR, "Failed to call getFirstDayOfWeek!");
     }
 
@@ -813,29 +738,23 @@
         return true;
 
     if (!options.isObject()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleNumberOptions: invalid options type: %d",
-                options.type());
         error = "Invalid options type!";
         return false;
     }
 
     Json::Value tv = options["type"];
     if (tv.isNull()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleNumberOptions: No type found!");
         error = "No type found!";
         return false;
     }
 
     if (!tv.isString()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleNumberOptions: Invalid type type: %d",
-                tv.type());
         error = "Invalid type type!";
         return false;
     }
 
     std::string tstr = tv.asString();
     if (tstr.empty()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleNumberOptions: Empty type!");
         error = "Empty type!";
         return false;
     }
@@ -847,8 +766,6 @@
     } else if (tstr == "decimal") {
         type = kNumberDecimal;
     } else {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::handleNumberOptions: unsupported type: %s",
-                tstr.c_str());
         error = "Unsupported type!";
         return false;
     }
@@ -859,7 +776,6 @@
 std::string GlobalizationNDK::numberToString(const std::string& args)
 {
     if (args.empty()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::numberToString: no arguments provided!");
         return errorInJson(UNKNOWN_ERROR, "No arguments provided!");
     }
 
@@ -868,20 +784,15 @@
     bool parse = reader.parse(args, root);
 
     if (!parse) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::numberToString: invalid json data: %s",
-                args.c_str());
         return errorInJson(PARSING_ERROR, "Invalid json data!");
     }
 
     Json::Value nv = root["number"];
     if (nv.isNull()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::numberToString: no number provided!");
         return errorInJson(FORMATTING_ERROR, "No number provided!");
     }
 
     if (!nv.isNumeric()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::numberToString: invalid number type: %d!",
-                nv.type());
         return errorInJson(FORMATTING_ERROR, "Invalid number type!");
     }
 
@@ -909,8 +820,6 @@
     }
 
     if (!nf) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::numberToString: failed to create NumberFormat instance for type %d: %d",
-                status, type);
         return errorInJson(UNKNOWN_ERROR, "Failed to create NumberFormat instance!");
     }
     std::auto_ptr<NumberFormat> deleter(nf);
@@ -926,7 +835,6 @@
 std::string GlobalizationNDK::stringToNumber(const std::string& args)
 {
     if (args.empty()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToNumber: no arguments provided!");
         return errorInJson(PARSING_ERROR, "No arguments provided!");
     }
 
@@ -935,26 +843,20 @@
     bool parse = reader.parse(args, root);
 
     if (!parse) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToNumber: invalid json data: %s",
-                args.c_str());
         return errorInJson(PARSING_ERROR, "Invalid json data!");
     }
 
     Json::Value sv = root["numberString"];
     if (sv.isNull()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToNumber: no numberString provided!");
         return errorInJson(FORMATTING_ERROR, "No numberString provided!");
     }
 
     if (!sv.isString()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToNumber: invalid numberString type: %d!",
-                sv.type());
         return errorInJson(FORMATTING_ERROR, "Invalid numberString type!");
     }
 
     std::string str = sv.asString();
     if (str.empty()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToNumber: empty numberString!");
         return errorInJson(FORMATTING_ERROR, "Empty numberString!");
     }
 
@@ -982,8 +884,6 @@
     }
 
     if (!nf) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToNumber: failed to create NumberFormat instance for type %d: %d",
-                status, type);
         return errorInJson(UNKNOWN_ERROR, "Failed to create NumberFormat instance!");
     }
     std::auto_ptr<NumberFormat> deleter(nf);
@@ -1002,14 +902,10 @@
         nf->parse(uStr, value, status);
 
     if (status != U_ZERO_ERROR && status != U_ERROR_WARNING_START) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToNumber: failed (%d) to parse string: %s",
-                status, str.c_str());
         return errorInJson(PARSING_ERROR, "Failed to parse string!");
     }
 
     if (!value.isNumeric()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::stringToNumber: string is not numeric: %s",
-                str.c_str());
         return errorInJson(FORMATTING_ERROR, "String is not numeric!");
     }
 
@@ -1027,8 +923,6 @@
         bool parse = reader.parse(args, root);
 
         if (!parse) {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getNumberPattern: invalid json data: %s",
-                    args.c_str());
             return errorInJson(PARSING_ERROR, "Invalid json data!");
         }
 
@@ -1058,22 +952,17 @@
     }
 
     if (!nf) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getNumberPattern: failed to create NumberFormat instance for type %d: %d",
-                status, type);
         return errorInJson(UNKNOWN_ERROR, "Failed to create NumberFormat instance!");
     }
     std::auto_ptr<NumberFormat> deleter(nf);
 
     if (nf->getDynamicClassID() != DecimalFormat::getStaticClassID()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getNumberPattern: DecimalFormat expected: %p != %p",
-                nf->getDynamicClassID(), DecimalFormat::getStaticClassID());
         return errorInJson(UNKNOWN_ERROR, "DecimalFormat expected!");
     }
 
     DecimalFormat* df = (DecimalFormat*) nf;
     const DecimalFormatSymbols* dfs = df->getDecimalFormatSymbols();
     if (!dfs) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getNumberPattern: unable to get DecimalFormatSymbols!");
         return errorInJson(UNKNOWN_ERROR, "Failed to get DecimalFormatSymbols instance!");
     }
 
@@ -1122,7 +1011,6 @@
 std::string GlobalizationNDK::getCurrencyPattern(const std::string& args)
 {
     if (args.empty()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: no arguments provided!");
         return errorInJson(UNKNOWN_ERROR, "No arguments provided!");
     }
 
@@ -1131,26 +1019,20 @@
     bool parse = reader.parse(args, root);
 
     if (!parse) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: invalid json data: %s",
-                args.c_str());
         return errorInJson(PARSING_ERROR, "Invalid json data!");
     }
 
     Json::Value ccv = root["currencyCode"];
     if (ccv.isNull()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: no currencyCode provided!");
         return errorInJson(FORMATTING_ERROR, "No currencyCode provided!");
     }
 
     if (!ccv.isString()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: invalid currencyCode type: %d!",
-                ccv.type());
         return errorInJson(FORMATTING_ERROR, "Invalid currencyCode type!");
     }
 
     std::string cc = ccv.asString();
     if (cc.empty()) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: empty currencyCode!");
         return errorInJson(FORMATTING_ERROR, "Empty currencyCode!");
     }
 
@@ -1162,16 +1044,12 @@
         UErrorCode status = U_ZERO_ERROR;
         NumberFormat* nf = NumberFormat::createCurrencyInstance(*(locs + i), status);
         if (!nf) {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: locale %d: unable to get NumberFormat instance!",
-                    i);
             continue;
         }
         std::auto_ptr<NumberFormat> ndeleter(nf);
 
         const UChar* currency = nf->getCurrency();
         if (!currency) {
-            slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: locale %d: failed to getCurrency!",
-                    i);
             continue;
         }
 
@@ -1188,7 +1066,6 @@
 
     const DecimalFormatSymbols* dfs = df->getDecimalFormatSymbols();
     if (!dfs) {
-        slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getCurrencyPattern: unable to get DecimalFormatSymbols!");
         return errorInJson(UNKNOWN_ERROR, "Failed to get DecimalFormatSymbols!");
     }
 
