diff --git a/source/common/dictionarydata.cpp b/source/common/dictionarydata.cpp
index cc84542..a29e509 100644
--- a/source/common/dictionarydata.cpp
+++ b/source/common/dictionarydata.cpp
@@ -35,7 +35,7 @@
     return DictionaryData::TRIE_TYPE_UCHARS;
 }
 
-int32_t UCharsDictionaryMatcher::matches(UText *text, int32_t maxLength, int *lengths, int &count, int limit, int32_t *values) const {
+int32_t UCharsDictionaryMatcher::matches(UText *text, int32_t maxLength, int32_t *lengths, int32_t &count, int32_t limit, int32_t *values) const {
     UCharsTrie uct(characters);
     UChar32 c = utext_next32(text);
     if (c < 0) {
@@ -99,7 +99,7 @@
     return DictionaryData::TRIE_TYPE_BYTES;
 }
 
-int32_t BytesDictionaryMatcher::matches(UText *text, int32_t maxLength, int *lengths, int &count, int limit, int32_t *values) const {
+int32_t BytesDictionaryMatcher::matches(UText *text, int32_t maxLength, int32_t *lengths, int32_t &count, int32_t limit, int32_t *values) const {
     BytesTrie bt(characters);
     UChar32 c = utext_next32(text);
     if (c < 0) {
diff --git a/source/common/dictionarydata.h b/source/common/dictionarydata.h
index eedc926..ad4c928 100644
--- a/source/common/dictionarydata.h
+++ b/source/common/dictionarydata.h
@@ -68,8 +68,8 @@
 public:
     virtual ~DictionaryMatcher();
     // this should emulate CompactTrieDictionary::matches()
-    virtual int32_t matches(UText *text, int32_t maxLength, int32_t *lengths, int &count,
-                            int limit, int32_t *values = NULL) const = 0;
+    virtual int32_t matches(UText *text, int32_t maxLength, int32_t *lengths, int32_t &count,
+                            int32_t limit, int32_t *values = NULL) const = 0;
     /** @return DictionaryData::TRIE_TYPE_XYZ */
     virtual int32_t getType() const = 0;
 };
@@ -81,8 +81,8 @@
     // The UDataMemory * will be closed on this object's destruction.
     UCharsDictionaryMatcher(const UChar *c, UDataMemory *f) : characters(c), file(f) { }
     virtual ~UCharsDictionaryMatcher();
-    virtual int32_t matches(UText *text, int32_t maxLength, int32_t *lengths, int &count,
-                            int limit, int32_t *values = NULL) const;
+    virtual int32_t matches(UText *text, int32_t maxLength, int32_t *lengths, int32_t &count,
+                            int32_t limit, int32_t *values = NULL) const;
     virtual int32_t getType() const;
 private:
     const UChar *characters;
@@ -98,8 +98,8 @@
     BytesDictionaryMatcher(const char *c, int32_t t, UDataMemory *f)
             : characters(c), transformConstant(t), file(f) { }
     virtual ~BytesDictionaryMatcher();
-    virtual int32_t matches(UText *text, int32_t maxLength, int32_t *lengths, int &count,
-                            int limit, int32_t *values = NULL) const;
+    virtual int32_t matches(UText *text, int32_t maxLength, int32_t *lengths, int32_t &count,
+                            int32_t limit, int32_t *values = NULL) const;
     virtual int32_t getType() const;
 private:
     UChar32 transform(UChar32 c) const;
diff --git a/source/config/mh-os400 b/source/config/mh-os400
index 1a236de..4e83e0d 100644
--- a/source/config/mh-os400
+++ b/source/config/mh-os400
@@ -1,8 +1,12 @@
 ## -*-makefile-*-
 ## OS400-specific setup (for cross build)
-## Copyright (c) 1999-2011, International Business Machines Corporation and
+## Copyright (c) 1999-2012, International Business Machines Corporation and
 ## others. All Rights Reserved.
 
+# This otherwise breaks on OS400 - can't find "shell"
+CURR_FULL_DIR=.
+CURR_SRCCODE_FULL_DIR=.
+
 GEN_DEPS.c=	$(CC1) -E -M $(DEFS) $(CPPFLAGS)
 GEN_DEPS.cc=	$(CXX1) -E -M $(DEFS) $(CPPFLAGS)
 
diff --git a/source/i18n/decimfmt.cpp b/source/i18n/decimfmt.cpp
index a4cfa8d..c4662c9 100644
--- a/source/i18n/decimfmt.cpp
+++ b/source/i18n/decimfmt.cpp
@@ -1146,7 +1146,7 @@
     int32_t intBegin = appendTo.length();
 
     while((prependZero--)>0) {
-      appendTo.append(0x0030); // '0'
+      appendTo.append((UChar)0x0030); // '0'
     }
 
     appendTo.append(outputStr+destIdx+
diff --git a/source/i18n/tzfmt.cpp b/source/i18n/tzfmt.cpp
index 2c69476..a7c7f9a 100644
--- a/source/i18n/tzfmt.cpp
+++ b/source/i18n/tzfmt.cpp
@@ -2057,7 +2057,7 @@
     }
 
     UnicodeString sep;
-    int32_t idx_H = offsetHM.tempSubString(0, idx_mm).lastIndexOf(0x0048 /* H */);
+    int32_t idx_H = offsetHM.tempSubString(0, idx_mm).lastIndexOf((UChar)0x0048 /* H */);
     if (idx_H >= 0) {
         sep = offsetHM.tempSubString(idx_H + 1, idx_mm - (idx_H + 1));
     }
diff --git a/source/i18n/zonemeta.cpp b/source/i18n/zonemeta.cpp
index 932c5ab..34cc484 100644
--- a/source/i18n/zonemeta.cpp
+++ b/source/i18n/zonemeta.cpp
@@ -871,20 +871,20 @@
     id.setTo(gCustomTzPrefix, -1);
     if (hour != 0 || min != 0) {
         if (negative) {
-            id.append(0x2D);    // '-'
+          id.append((UChar)0x2D);    // '-'
         } else {
-            id.append(0x2B);    // '+'
+          id.append((UChar)0x2B);    // '+'
         }
         // Always use US-ASCII digits
-        id.append(0x30 + (hour%100)/10);
-        id.append(0x30 + (hour%10));
-        id.append(0x3A);    // ':'
-        id.append(0x30 + (min%100)/10);
-        id.append(0x30 + (min%10));
+        id.append((UChar)0x30 + (hour%100)/10);
+        id.append((UChar)0x30 + (hour%10));
+        id.append((UChar)0x3A);    // ':'
+        id.append((UChar)(0x30 + (min%100)/10));
+        id.append((UChar)(0x30 + (min%10)));
         if (sec != 0) {
-            id.append(0x3A);    // ':'
-            id.append(0x30 + (sec%100)/10);
-            id.append(0x30 + (sec%10));
+          id.append((UChar)0x3A);    // ':'
+          id.append((UChar)(0x30 + (sec%100)/10));
+          id.append((UChar)(0x30 + (sec%10)));
         }
     }
     return id;
diff --git a/source/test/intltest/plurfmts.cpp b/source/test/intltest/plurfmts.cpp
index 6af4a91..69e8f88 100644
--- a/source/test/intltest/plurfmts.cpp
+++ b/source/test/intltest/plurfmts.cpp
@@ -587,17 +587,17 @@
     if (errorCode.logDataIfFailureAndReset("PluralFormat(en, UPLURAL_TYPE_ORDINAL, pattern) failed")) {
       return;
     }
-    UnicodeString result = pf.format(321, errorCode);
+    UnicodeString result = pf.format((int32_t)321, errorCode);
     if (!errorCode.logIfFailureAndReset("PluralFormat.format(321) failed") &&
         result != UNICODE_STRING_SIMPLE("321st file")) {
       errln(UnicodeString("PluralFormat.format(321) wrong result string: ") + result);
     }
-    result = pf.format(22, errorCode);
+    result = pf.format((int32_t)22, errorCode);
     if (!errorCode.logIfFailureAndReset("PluralFormat.format(22) failed") &&
         result != UNICODE_STRING_SIMPLE("22nd file")) {
       errln(UnicodeString("PluralFormat.format(22) wrong result string: ") + result);
     }
-    result = pf.format(3, errorCode);
+    result = pf.format((int32_t)3, errorCode);
     if (!errorCode.logIfFailureAndReset("PluralFormat.format(3) failed") &&
         result != UNICODE_STRING_SIMPLE("3rd file")) {
       errln(UnicodeString("PluralFormat.format(3) wrong result string: ") + result);
@@ -609,12 +609,12 @@
     if (errorCode.logIfFailureAndReset("PluralFormat(en, UPLURAL_TYPE_ORDINAL, pattern) failed")) {
       return;
     }
-    result = pf2.format(456, errorCode);
+    result = pf2.format((int32_t)456, errorCode);
     if (!errorCode.logIfFailureAndReset("PluralFormat.format(456) failed") &&
         result != UNICODE_STRING_SIMPLE("456th file")) {
       errln(UnicodeString("PluralFormat.format(456) wrong result string: ") + result);
     }
-    result = pf2.format(111, errorCode);
+    result = pf2.format((int32_t)111, errorCode);
     if (!errorCode.logIfFailureAndReset("PluralFormat.format(111) failed") &&
         result != UNICODE_STRING_SIMPLE("111th file")) {
       errln(UnicodeString("PluralFormat.format(111) wrong result string: ") + result);
