--- a/cpp/allTests.py
+++ b/cpp/allTests.py
@@ -25,6 +25,7 @@
 # List of all basic tests.
 #
 tests = [ 
+
     ("IceUtil/condvar", ["once", "win32only"]),
     ("IceUtil/thread",  ["once"]),
     ("IceUtil/unicode", ["once"]),
@@ -62,7 +63,7 @@
     ("Ice/servantLocator", ["core"]),
     ("Ice/interceptor", ["core"]),
     ("Ice/stringConverter", ["core"]),
-    ("Ice/udp", ["core"]),
+    ("Ice/udp", ["core", "nofreebsdjail"]),
     ("Ice/defaultServant", ["core"]),
     ("Ice/defaultValue", ["core"]),
     ("Ice/invoke", ["core", "novc6"]),
@@ -106,8 +107,8 @@
 #
 if TestUtil.isWin32() or os.getuid() == 0:
     tests += [
-        ("IceUtil/priority", ["core", "nodarwin"]),
-        ("Ice/threadPoolPriority", ["core", "nodarwin"])
+        ("IceUtil/priority", ["core", "nodarwin", "nofreebsd"]),
+        ("Ice/threadPoolPriority", ["core", "nodarwin", "nofreebsd"])
         ]
 
 if __name__ == "__main__":
--- a/cpp/include/Freeze/Map.h
+++ b/cpp/include/Freeze/Map.h
@@ -426,7 +426,7 @@
 
     ConstIterator(MapHelper& mapHelper, const Ice::CommunicatorPtr& communicator) :
         _helper(IteratorHelper::create(mapHelper, true)), 
-        _communicator(_communicator),
+        _communicator(communicator),
         _refValid(false)
     {
     }
--- a/cpp/include/Ice/Buffer.h
+++ b/cpp/include/Ice/Buffer.h
@@ -10,6 +10,7 @@
 #ifndef ICEE_BUFFER_H
 #define ICEE_BUFFER_H
 
+#include <cstddef>
 #include <Ice/Config.h>
 
 namespace IceInternal
--- a/cpp/include/Ice/ConnectionIF.h
+++ b/cpp/include/Ice/ConnectionIF.h
@@ -17,13 +17,13 @@
 {
 
 class ConnectionI;
+ICE_API Ice::LocalObject* upCast(Ice::ConnectionI*);
 
 }
 
 namespace IceInternal
 {
 
-ICE_API Ice::LocalObject* upCast(Ice::ConnectionI*);
 
 enum AsyncStatus
 {
--- a/cpp/include/Ice/IconvStringConverter.h
+++ b/cpp/include/Ice/IconvStringConverter.h
@@ -225,10 +225,16 @@
 template<typename charT> /*static*/ void
 IconvStringConverter<charT>::close(std::pair<iconv_t, iconv_t> cdp)
 {
-    int rs = iconv_close(cdp.first);
+#ifndef NDEBUG
+    int rs = 
+#endif
+    iconv_close(cdp.first);
     assert(rs == 0);
 
-    rs = iconv_close(cdp.second);
+#ifndef NDEBUG
+    rs = 
+#endif
+    iconv_close(cdp.second);
     assert(rs == 0);
 }
  
--- a/cpp/include/Ice/IncomingAsyncF.h
+++ b/cpp/include/Ice/IncomingAsyncF.h
@@ -28,12 +28,6 @@
 
 class AMD_Object_ice_invoke;
 class AMD_Array_Object_ice_invoke;
-
-}
-
-namespace IceInternal
-{
-
 ICE_API IceUtil::Shared* upCast(::Ice::AMD_Object_ice_invoke*);
 ICE_API IceUtil::Shared* upCast(::Ice::AMD_Array_Object_ice_invoke*);
 
--- a/cpp/include/Ice/LocalObjectF.h
+++ b/cpp/include/Ice/LocalObjectF.h
@@ -18,12 +18,6 @@
 {
 
 class LocalObject;
-
-}
-
-namespace IceInternal
-{
-
 ICE_API IceUtil::Shared* upCast(::Ice::LocalObject*);
 
 }
--- a/cpp/include/Ice/ObjectF.h
+++ b/cpp/include/Ice/ObjectF.h
@@ -17,19 +17,8 @@
 {
 
 class Object;
-
-}
-
-namespace IceInternal
-{
-
 ICE_API IceUtil::Shared* upCast(::Ice::Object*);
 
-}
-
-namespace Ice
-{
-
 typedef IceInternal::Handle< Object > ObjectPtr;
 
 void ICE_API __patch__ObjectPtr(void*, ObjectPtr&);
--- a/cpp/include/Ice/OutgoingAsyncF.h
+++ b/cpp/include/Ice/OutgoingAsyncF.h
@@ -19,13 +19,13 @@
 
 class AsyncResult;
 typedef IceInternal::Handle<AsyncResult> AsyncResultPtr;
+ICE_API IceUtil::Shared* upCast(::Ice::AsyncResult*);
 
 }
 
 namespace IceInternal
 {
 
-ICE_API IceUtil::Shared* upCast(::Ice::AsyncResult*);
 
 class OutgoingAsync;
 ICE_API IceUtil::Shared* upCast(OutgoingAsync*);
--- a/cpp/include/Ice/Proxy.h
+++ b/cpp/include/Ice/Proxy.h
@@ -38,6 +38,8 @@
 
 class Locator;
 class Router;
+ICE_API ::IceProxy::Ice::Object* upCast(::IceProxy::Ice::Locator*);
+ICE_API ::IceProxy::Ice::Object* upCast(::IceProxy::Ice::Router*);
 
 }
 
@@ -46,8 +48,6 @@
 namespace IceInternal
 {
 
-ICE_API ::IceProxy::Ice::Object* upCast(::IceProxy::Ice::Locator*);
-ICE_API ::IceProxy::Ice::Object* upCast(::IceProxy::Ice::Router*);
 
 class LocalExceptionWrapper;
 
@@ -1172,7 +1172,7 @@
 
     TwowayCallbackNC(const TPtr& instance, bool cb, Exception excb, Sent sentcb) : CallbackNC<T>(instance, excb, sentcb)
     {
-        checkCallback(instance, cb || excb != 0);
+        this->checkCallback(instance, cb || excb != 0);
     }
 };
 
@@ -1188,7 +1188,7 @@
 
     TwowayCallback(const TPtr& instance, bool cb, Exception excb, Sent sentcb) : Callback<T, CT>(instance, excb, sentcb)
     {
-        checkCallback(instance, cb || excb != 0);
+        this->checkCallback(instance, cb || excb != 0);
     }
 };
 
@@ -1209,7 +1209,7 @@
     OnewayCallbackNC(const TPtr& instance, Response cb, Exception excb, Sent sentcb) : 
         CallbackNC<T>(instance, excb, sentcb), response(cb)
     {
-        checkCallback(instance, cb != 0 || excb != 0);
+        this->checkCallback(instance, cb != 0 || excb != 0);
     }
 
     virtual void __completed(const ::Ice::AsyncResultPtr& result) const
@@ -1254,7 +1254,7 @@
     OnewayCallback(const TPtr& instance, Response cb, Exception excb, Sent sentcb) : 
         Callback<T, CT>(instance, excb, sentcb),  response(cb)
     {
-        checkCallback(instance, cb != 0 || excb != 0);
+        this->checkCallback(instance, cb != 0 || excb != 0);
     }
 
     virtual void __completed(const ::Ice::AsyncResultPtr& result) const
--- a/cpp/include/Ice/ProxyF.h
+++ b/cpp/include/Ice/ProxyF.h
@@ -22,6 +22,11 @@
 {
 
 class Object;
+inline ::IceProxy::Ice::Object* 
+upCast(::IceProxy::Ice::Object* o)
+{
+    return o;
+}
 
 }
 
@@ -34,6 +39,11 @@
 {
 
 class Object;
+inline ::IceDelegate::Ice::Object*
+upCast(::IceDelegate::Ice::Object* o)
+{
+    return o;
+}
 
 }
 
@@ -47,6 +57,12 @@
 
 class Object;
 
+inline ::IceDelegateM::Ice::Object*
+upCast(::IceDelegateM::Ice::Object* o)
+{
+    return o;
+}
+
 }
 
 }
@@ -58,36 +74,12 @@
 {
 
 class Object;
-
-}
-
-}
-
-namespace IceInternal
-{
-
-inline ::IceProxy::Ice::Object* 
-upCast(::IceProxy::Ice::Object* o)
-{
-    return o;
-}
-
-inline ::IceDelegate::Ice::Object*
-upCast(::IceDelegate::Ice::Object* o)
-{
-    return o;
-}
-
 inline ::IceDelegateD::Ice::Object*
 upCast(::IceDelegateD::Ice::Object* o)
 {
     return o;
 }
 
-inline ::IceDelegateM::Ice::Object*
-upCast(::IceDelegateM::Ice::Object* o)
-{
-    return o;
 }
 
 }
--- a/cpp/include/Ice/Stream.h
+++ b/cpp/include/Ice/Stream.h
@@ -17,6 +17,12 @@
 #include <Ice/Proxy.h>
 #include <IceUtil/Shared.h>
 
+namespace IceInternal
+{
+    // Forward declaration required for writer specializations.
+    void delegateThrowMarshalException(const char*, int, const ::std::string&);
+}
+
 namespace Ice
 {
     
@@ -45,9 +51,6 @@
     StreamTraitTypeUnknown
 };
 
-// Forward declaration required for writer specializations.
-class MarshalException;
-
 //
 // Base trait template. This doesn't actually do anything -- we just
 // use it as a template that we can specialize.
@@ -542,7 +545,7 @@
     {
         if(static_cast<int>(v) < 0 || static_cast<int>(v) >= StreamTrait<T>::enumLimit)
         {
-            throw MarshalException(__FILE__, __LINE__, "enumerator out of range");
+            IceInternal::delegateThrowMarshalException(__FILE__, __LINE__, "enumerator out of range");
         }
         outS->write(static_cast<Byte>(v));
     }
@@ -558,7 +561,7 @@
         inS->read(val);
         if(val > StreamTrait<T>::enumLimit)
         {
-            throw MarshalException(__FILE__, __LINE__, "enumerator out of range");
+            IceInternal::delegateThrowMarshalException(__FILE__, __LINE__, "enumerator out of range");
         }
         v = static_cast<T>(val);
     }
@@ -573,7 +576,7 @@
     {
         if(static_cast<int>(v) < 0 || static_cast<int>(v) >= StreamTrait<T>::enumLimit)
         {
-            throw MarshalException(__FILE__, __LINE__, "enumerator out of range");
+            IceInternal::delegateThrowMarshalException(__FILE__, __LINE__, "enumerator out of range");
         }
         outS->write(static_cast<Short>(v));
     }
@@ -589,7 +592,7 @@
         inS->read(val);
         if(val < 0 || val > StreamTrait<T>::enumLimit)
         {
-            throw MarshalException(__FILE__, __LINE__, "enumerator out of range");
+            IceInternal::delegateThrowMarshalException(__FILE__, __LINE__, "enumerator out of range");
         }
         v = static_cast<T>(val);
     }
@@ -603,7 +606,7 @@
     {
         if(static_cast<int>(v) < 0 || static_cast<int>(v) >= StreamTrait<T>::enumLimit)
         {
-            throw MarshalException(__FILE__, __LINE__, "enumerator out of range");
+            IceInternal::delegateThrowMarshalException(__FILE__, __LINE__, "enumerator out of range");
         }
         outS->write(static_cast<Int>(v));
     }
@@ -619,7 +622,7 @@
         inS->read(val);
         if(val < 0 || val > StreamTrait<T>::enumLimit)
         {
-            throw MarshalException(__FILE__, __LINE__, "enumerator out of range");
+            IceInternal::delegateThrowMarshalException(__FILE__, __LINE__, "enumerator out of range");
         }
         v = static_cast<T>(val);
     }
--- a/cpp/include/Ice/StreamF.h
+++ b/cpp/include/Ice/StreamF.h
@@ -19,12 +19,6 @@
 
 class InputStream;
 class OutputStream;
-
-}
-
-namespace IceInternal
-{
-
 ICE_API IceUtil::Shared* upCast(::Ice::InputStream*);
 ICE_API IceUtil::Shared* upCast(::Ice::OutputStream*);
 
--- a/cpp/include/IceUtil/Mutex.h
+++ b/cpp/include/IceUtil/Mutex.h
@@ -251,8 +251,11 @@
 inline
 Mutex::~Mutex()
 {
+#ifndef NDEBUG
     int rc = 0;
-    rc = pthread_mutex_destroy(&_mutex);
+    rc = 
+#endif    
+    pthread_mutex_destroy(&_mutex);
     assert(rc == 0);
 }
 
--- a/cpp/src/Freeze/MapDb.cpp
+++ b/cpp/src/Freeze/MapDb.cpp
@@ -229,7 +229,11 @@
 #ifndef NDEBUG
                 bool inserted = 
 #endif
-                    _indices.insert(IndexMap::value_type(indexBase->name(), indexI.get())).second;
+                    _indices.insert(IndexMap::value_type(indexBase->name(), indexI.get()))
+#ifndef NDEBUG                    
+                    .second
+#endif
+                ;
                 assert(inserted);
                 
                 indexBase->_impl = indexI.release();
--- a/cpp/src/Freeze/MapI.cpp
+++ b/cpp/src/Freeze/MapI.cpp
@@ -749,8 +749,11 @@
 
     try
     {
+#ifndef NDEBUG
         int err;
-        err = _dbc->put(&dbKey, &dbValue, DB_CURRENT);
+        err = 
+#endif
+        _dbc->put(&dbKey, &dbValue, DB_CURRENT);
         assert(err == 0);
     }
     catch(const ::DbDeadlockException& dx)
@@ -1023,7 +1026,11 @@
 #ifndef NDEBUG
         bool inserted =
 #endif 
-            _indices.insert(IndexMap::value_type(indexBase->name(), indexBase)).second;
+            _indices.insert(IndexMap::value_type(indexBase->name(), indexBase))
+#ifndef NDEBUG
+            .second
+#endif
+            ;
         assert(inserted);
         indexBase->_map = this;
     }
@@ -1360,8 +1367,11 @@
         try
         {
             u_int32_t count;
+#ifndef NDEBUG
             int err;
-            err = _db->truncate(txn, &count, txn != 0 ? 0 : DB_AUTO_COMMIT);
+            err = 
+#endif            
+            _db->truncate(txn, &count, txn != 0 ? 0 : DB_AUTO_COMMIT);
             assert(err == 0);
             break;
         }
--- a/cpp/src/Freeze/SharedDbEnv.cpp
+++ b/cpp/src/Freeze/SharedDbEnv.cpp
@@ -336,8 +336,11 @@
         // Remove from map
         //
      
+#ifndef NDEBUG
         size_t one;
-        one = sharedDbEnvMap->erase(key);
+        one = 
+#endif
+        sharedDbEnvMap->erase(key);
         assert(one == 1);
 
         if(sharedDbEnvMap->size() == 0)
--- a/cpp/src/Ice/ConnectionI.cpp
+++ b/cpp/src/Ice/ConnectionI.cpp
@@ -31,7 +31,7 @@
 using namespace Ice;
 using namespace IceInternal;
 
-Ice::LocalObject* IceInternal::upCast(ConnectionI* p) { return p; }
+Ice::LocalObject* Ice::upCast(ConnectionI* p) { return p; }
 
 namespace
 {
@@ -600,6 +600,7 @@
     }
     catch(const LocalException& ex)
     {
+        status = IceInternal::AsyncStatusQueued; // this is only to apeace the compiler
         setState(StateClosed, ex);
         assert(_exception.get());
         _exception->ice_throw();
@@ -971,6 +972,7 @@
     }
     catch(const Ice::LocalException& ex)
     {
+        status = IceInternal::AsyncStatusQueued; // this is only to apeace the compiler
         setState(StateClosed, ex);
         assert(_exception.get());
         _exception->ice_throw();
--- a/cpp/src/Ice/IncomingAsync.cpp
+++ b/cpp/src/Ice/IncomingAsync.cpp
@@ -24,7 +24,7 @@
 using namespace IceInternal;
 
 IceUtil::Shared* IceInternal::upCast(IncomingAsync* p) { return p; }
-IceUtil::Shared* IceInternal::upCast(AMD_Object_ice_invoke* p) { return p; }
+IceUtil::Shared* Ice::upCast(AMD_Object_ice_invoke* p) { return p; }
 
 namespace
 {
--- a/cpp/src/Ice/LocalObject.cpp
+++ b/cpp/src/Ice/LocalObject.cpp
@@ -13,7 +13,7 @@
 using namespace Ice;
 using namespace IceInternal;
 
-IceUtil::Shared* IceInternal::upCast(LocalObject* obj) { return obj; }
+IceUtil::Shared* Ice::upCast(LocalObject* obj) { return obj; }
 
 bool
 Ice::LocalObject::operator==(const LocalObject& r) const
--- a/cpp/src/Ice/Object.cpp
+++ b/cpp/src/Ice/Object.cpp
@@ -19,7 +19,7 @@
 using namespace Ice;
 using namespace IceInternal;
 
-IceUtil::Shared* IceInternal::upCast(Object* p) { return p; }
+IceUtil::Shared* Ice::upCast(Object* p) { return p; }
 
 bool
 Ice::Object::operator==(const Object& r) const
--- a/cpp/src/Ice/OutgoingAsync.cpp
+++ b/cpp/src/Ice/OutgoingAsync.cpp
@@ -30,7 +30,7 @@
 using namespace Ice;
 using namespace IceInternal;
 
-IceUtil::Shared* IceInternal::upCast(AsyncResult* p) { return p; }
+IceUtil::Shared* Ice::upCast(AsyncResult* p) { return p; }
 
 IceUtil::Shared* IceInternal::upCast(OutgoingAsyncMessageCallback* p) { return p; }
 IceUtil::Shared* IceInternal::upCast(OutgoingAsync* p) { return p; }
--- a/cpp/src/Ice/ProxyFactory.cpp
+++ b/cpp/src/Ice/ProxyFactory.cpp
@@ -229,6 +229,7 @@
     } 
     else if(cnt > static_cast<int>(_retryIntervals.size()))
     {
+        interval = 0; // apeace compiler
         if(traceLevels->retry >= 1)
         {
             Trace out(logger, traceLevels->retryCat);
--- a/cpp/src/Ice/Service.cpp
+++ b/cpp/src/Ice/Service.cpp
@@ -2136,17 +2136,26 @@
             //
             // Associate stdin, stdout and stderr with /dev/null.
             //
+#ifndef NDEBUG
             int fd;
-            fd = open("/dev/null", O_RDWR);
+            fd = 
+#endif
+            open("/dev/null", O_RDWR);
             assert(fd == 0);
             if(stdOut.empty())
             {
-                fd = dup2(0, 1);
+#ifndef NDEBUG
+                fd = 
+#endif
+                dup2(0, 1);
                 assert(fd == 1);
             }
             if(stdErr.empty())
             {
-                fd = dup2(1, 2);
+#ifndef NDEBUG
+                fd = 
+#endif
+                dup2(1, 2);
                 assert(fd == 2);
             }
         }
--- a/cpp/src/Ice/Stream.cpp
+++ b/cpp/src/Ice/Stream.cpp
@@ -8,10 +8,19 @@
 // **********************************************************************
 
 #include <Ice/Stream.h>
+#include <Ice/LocalException.h>
 
 using namespace std;
 using namespace Ice;
 using namespace IceInternal;
 
-IceUtil::Shared* IceInternal::upCast(InputStream* p) { return p; }
-IceUtil::Shared* IceInternal::upCast(OutputStream* p) { return p; }
+IceUtil::Shared* Ice::upCast(InputStream* p) { return p; }
+IceUtil::Shared* Ice::upCast(OutputStream* p) { return p; }
+
+namespace IceInternal
+{
+  void delegateThrowMarshalException(const char* file, int line , const ::std::string& message)
+  {
+    throw Ice::MarshalException(file, line, message);
+  }
+}
--- a/cpp/src/IceGrid/AdminCallbackRouter.cpp
+++ b/cpp/src/IceGrid/AdminCallbackRouter.cpp
@@ -49,7 +49,12 @@
 #ifndef NDEBUG
     bool inserted =
 #endif
-        _categoryToConnection.insert(map<string, ConnectionPtr>::value_type(category, con)).second;
+        _categoryToConnection.insert(map<string, ConnectionPtr>::value_type(category, con))
+#ifndef NDEBUG
+        .second
+#endif
+        ;
+
     
     assert(inserted == true);
 }
--- a/cpp/src/IceGrid/DescriptorHelper.cpp
+++ b/cpp/src/IceGrid/DescriptorHelper.cpp
@@ -198,15 +198,6 @@
     return result;
 }
 
-template<typename Dict> Dict
-getDictUpdatedElts(const Dict& ldict, const Dict& rdict)
-{
-#if defined(_MSC_VER) && (_MSC_VER < 1300)
-    return getDictUpdatedEltsWithEq(ldict, rdict, equal_to<Dict::mapped_type>());
-#else
-    return getDictUpdatedEltsWithEq(ldict, rdict, equal_to<typename Dict::mapped_type>());
-#endif
-}
 
 template<typename EqFunc, typename Dict> Dict
 getDictUpdatedEltsWithEq(const Dict& ldict, const Dict& rdict, EqFunc eq)
@@ -223,6 +214,16 @@
     return result;
 }
 
+template<typename Dict> Dict
+getDictUpdatedElts(const Dict& ldict, const Dict& rdict)
+{
+#if defined(_MSC_VER) && (_MSC_VER < 1300)
+    return getDictUpdatedEltsWithEq(ldict, rdict, equal_to<Dict::mapped_type>());
+#else
+    return getDictUpdatedEltsWithEq(ldict, rdict, equal_to<typename Dict::mapped_type>());
+#endif
+}
+
 template <typename Dict> Ice::StringSeq
 getDictRemovedElts(const Dict& ldict, const Dict& rdict)
 {
--- a/cpp/src/IceGrid/ReplicaCache.cpp
+++ b/cpp/src/IceGrid/ReplicaCache.cpp
@@ -40,7 +40,7 @@
     Lock sync(*this);
     
     ReplicaEntryPtr entry;
-    while(entry = getImpl(name))
+    while((entry = getImpl(name)))
     {
         ReplicaSessionIPtr session = entry->getSession();
         if(session->isDestroyed())
--- a/cpp/src/IceGrid/SessionI.h
+++ b/cpp/src/IceGrid/SessionI.h
@@ -35,7 +35,7 @@
 class SessionI;
 typedef IceUtil::Handle<SessionI> SessionIPtr;
 
-class BaseSessionI : virtual Ice::Object, public IceUtil::Mutex
+class BaseSessionI : virtual public Ice::Object, public IceUtil::Mutex
 {
 public:
 
--- a/cpp/src/IceSSL/Instance.cpp
+++ b/cpp/src/IceSSL/Instance.cpp
@@ -38,7 +38,7 @@
 using namespace Ice;
 using namespace IceSSL;
 
-IceUtil::Shared* IceInternal::upCast(IceSSL::Instance* p) { return p; }
+IceUtil::Shared* IceSSL::upCast(IceSSL::Instance* p) { return p; }
 
 namespace
 {
--- a/cpp/src/IceSSL/InstanceF.h
+++ b/cpp/src/IceSSL/InstanceF.h
@@ -18,13 +18,13 @@
 {
 
 class Instance;
+IceUtil::Shared* upCast(IceSSL::Instance*);
 
 }
 
 namespace IceInternal
 {
 
-IceUtil::Shared* upCast(IceSSL::Instance*);
 
 }
 
--- a/cpp/src/IceSSL/TrustManager.cpp
+++ b/cpp/src/IceSSL/TrustManager.cpp
@@ -20,7 +20,7 @@
 using namespace std;
 using namespace IceSSL;
 
-IceUtil::Shared* IceInternal::upCast(IceSSL::TrustManager* p) { return p; }
+IceUtil::Shared* IceSSL::upCast(IceSSL::TrustManager* p) { return p; }
 
 TrustManager::TrustManager(const Ice::CommunicatorPtr& communicator) :
     _communicator(communicator)
--- a/cpp/src/IceSSL/TrustManagerF.h
+++ b/cpp/src/IceSSL/TrustManagerF.h
@@ -18,13 +18,13 @@
 {
 
 class TrustManager;
+IceUtil::Shared* upCast(IceSSL::TrustManager*);
 
 }
 
 namespace IceInternal
 {
 
-IceUtil::Shared* upCast(IceSSL::TrustManager*);
 
 }
 
--- a/cpp/src/IceSSL/Util.cpp
+++ b/cpp/src/IceSSL/Util.cpp
@@ -175,7 +175,7 @@
     return dh;
 }
 
-IceUtil::Shared* IceInternal::upCast(IceSSL::DHParams* p) { return p; }
+IceUtil::Shared* IceSSL::upCast(IceSSL::DHParams* p) { return p; }
 
 IceSSL::DHParams::DHParams() :
     _dh512(0), _dh1024(0), _dh2048(0), _dh4096(0)
--- a/cpp/src/IceSSL/UtilF.h
+++ b/cpp/src/IceSSL/UtilF.h
@@ -21,13 +21,13 @@
 {
 
 class DHParams;
+IceUtil::Shared* upCast(IceSSL::DHParams*);
 
 }
 
 namespace IceInternal
 {
 
-IceUtil::Shared* upCast(IceSSL::DHParams*);
 
 }
 
--- a/cpp/src/IceStorm/NodeI.cpp
+++ b/cpp/src/IceStorm/NodeI.cpp
@@ -18,11 +18,6 @@
 namespace
 {
 
-bool operator==(const GroupNodeInfo& info, int id)
-{
-    return info.id == id;
-}
-
 class CheckTask : public IceUtil::TimerTask
 {
     const NodeIPtr _node;
--- a/cpp/src/IceUtil/Cond.cpp
+++ b/cpp/src/IceUtil/Cond.cpp
@@ -330,8 +330,11 @@
 
 IceUtil::Cond::~Cond()
 {
+#ifndef NDEBUG
     int rc = 0;
-    rc = pthread_cond_destroy(&_cond);
+    rc = 
+#endif
+    pthread_cond_destroy(&_cond);
     assert(rc == 0);
 }
 
--- a/cpp/src/IceUtil/CountDownLatch.cpp
+++ b/cpp/src/IceUtil/CountDownLatch.cpp
@@ -44,10 +44,16 @@
 #ifdef _WIN32
     CloseHandle(_event);
 #else
+#ifndef NDEBUG
     int rc = 0;
-    rc = pthread_mutex_destroy(&_mutex);
+    rc = 
+#endif
+    pthread_mutex_destroy(&_mutex);
     assert(rc == 0);
-    rc = pthread_cond_destroy(&_cond);
+#ifndef NDEBUG
+    rc = 
+#endif
+    pthread_cond_destroy(&_cond);
     assert(rc == 0);
 #endif
 }
--- a/cpp/src/IceUtil/CtrlCHandler.cpp
+++ b/cpp/src/IceUtil/CtrlCHandler.cpp
@@ -219,18 +219,27 @@
         sigaddset(&ctrlCLikeSignals, SIGHUP);
         sigaddset(&ctrlCLikeSignals, SIGINT);
         sigaddset(&ctrlCLikeSignals, SIGTERM);
-        int rc = pthread_sigmask(SIG_BLOCK, &ctrlCLikeSignals, 0);
+#ifndef NDEBUG
+        int rc = 
+#endif        
+        pthread_sigmask(SIG_BLOCK, &ctrlCLikeSignals, 0);
         assert(rc == 0);
 
         // Joinable thread
-        rc = pthread_create(&_tid, 0, sigwaitThread, 0);
+#ifndef NDEBUG
+        rc = 
+#endif
+        pthread_create(&_tid, 0, sigwaitThread, 0);
         assert(rc == 0);
     }
 }
 
 CtrlCHandler::~CtrlCHandler()
 {
-    int rc = pthread_cancel(_tid);
+#ifndef NDEBUG
+    int rc = 
+#endif
+    pthread_cancel(_tid);
     assert(rc == 0);
 #if defined(__APPLE__)
     //
@@ -241,7 +250,10 @@
     //assert(rc == 0); For some reaosns, this assert is sometime triggered
 #endif
     void* status = 0;
-    rc = pthread_join(_tid, &status);
+#ifndef NDEBUG
+    rc = 
+#endif
+    pthread_join(_tid, &status);
     assert(rc == 0);
 #if !defined(__APPLE__)
     assert(status == PTHREAD_CANCELED);
--- a/cpp/src/IceUtil/FileUtil.cpp
+++ b/cpp/src/IceUtil/FileUtil.cpp
@@ -16,6 +16,8 @@
 
 #ifdef _WIN32
 #  include <process.h>
+#else
+#  include <unistd.h>
 #endif
 
 #ifdef _WIN32
@@ -198,7 +200,7 @@
         throw IceUtil::FileLockException(__FILE__, __LINE__, GetLastError(), _path);
     }
     //
-    // In Windows implementation we don't write the process pid to the file, as is 
+    // In Windows implementation we don't write the process pid to the file, as is
     // not posible to read the file from other process while it is locked here.
     //
 }
@@ -237,7 +239,7 @@
     {
         flags |= _O_WRONLY | _O_CREAT;
     }
-    else 
+    else
     {
         flags |= _O_RDWR;
         if(mode & ios_base::trunc)
@@ -466,10 +468,10 @@
     lock.l_whence = SEEK_SET; // Begining of file
     lock.l_start = 0;
     lock.l_len = 0;
-    
+
     //
-    // F_SETLK tells fcntl to not block if it cannot 
-    // acquire the lock, if the lock cannot be acquired 
+    // F_SETLK tells fcntl to not block if it cannot
+    // acquire the lock, if the lock cannot be acquired
     // it returns -1 without wait.
     //
     if(::fcntl(_fd, F_SETLK, &lock) == -1)
@@ -483,14 +485,14 @@
     // If there is an error after here, we close the fd,
     // to release the lock.
     //
-    
+
     //
     // Now that we have acquire an excluxive write lock,
     // write the process pid there.
     //
     ostringstream os;
     os << getpid();
-    
+
     if(write(_fd, os.str().c_str(), os.str().size()) == -1)
     {
         IceUtil::FileLockException ex(__FILE__, __LINE__, errno, _path);
--- a/cpp/src/IceUtil/RecMutex.cpp
+++ b/cpp/src/IceUtil/RecMutex.cpp
@@ -148,8 +148,11 @@
 IceUtil::RecMutex::~RecMutex()
 {
     assert(_count == 0);
+#ifndef NDEBUG
     int rc = 0;
-    rc = pthread_mutex_destroy(&_mutex);
+    rc = 
+#endif
+    pthread_mutex_destroy(&_mutex);
     assert(rc == 0);
 }
 
@@ -196,8 +199,11 @@
 {
     if(--_count == 0)
     {
+#ifndef NDEBUG
         int rc = 0; // Prevent warnings when NDEBUG is defined.
-        rc = pthread_mutex_unlock(&_mutex);
+        rc = 
+#endif
+        pthread_mutex_unlock(&_mutex);
         assert(rc == 0);
     }
 }
--- a/cpp/src/Slice/CPlusPlusUtil.cpp
+++ b/cpp/src/Slice/CPlusPlusUtil.cpp
@@ -631,7 +631,7 @@
         string scope = fixKwd(cl->scope());
         if(marshal)
         {
-            out << nl << stream << deref << "write(::Ice::ObjectPtr(::IceInternal::upCast(" << fixedParam 
+            out << nl << stream << deref << "write(::Ice::ObjectPtr(" << scope << "upCast(" << fixedParam 
                 << ".get())));";
         }
         else
@@ -649,7 +649,7 @@
         string scope = fixKwd(px->_class()->scope());
         if(marshal)
         {
-            out << nl << stream << deref << "write(::Ice::ObjectPrx(::IceInternal::upCast(" << fixedParam 
+            out << nl << stream << deref << "write(::Ice::ObjectPrx(::IceProxy" << scope << "upCast(" << fixedParam 
                 << ".get())));";
         }
         else
--- a/cpp/src/Slice/FileTracker.cpp
+++ b/cpp/src/Slice/FileTracker.cpp
@@ -15,6 +15,8 @@
 
 #ifdef _WIN32
 #   include <direct.h>
+#else
+#   include <unistd.h>
 #endif
 
 using namespace std;
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -1944,8 +1944,10 @@
     }
 
     string name = fixKwd(p->name());
+    string scoped = fixKwd(p->scoped());
 
     H << sp << nl << "class " << name << ';';
+    H << nl << _dllExport << "::IceProxy::Ice::Object* upCast(::IceProxy" << scoped << "*);";
 }
 
 Slice::Gen::ProxyVisitor::ProxyVisitor(Output& h, Output& c, const string& dllExport) :
@@ -3691,10 +3693,22 @@
 Slice::Gen::ObjectDeclVisitor::visitClassDecl(const ClassDeclPtr& p)
 {
     string name = fixKwd(p->name());
+    string scoped = fixKwd(p->scoped());
 
     H << sp << nl << "class " << name << ';';
     H << nl << "bool operator==(const " << name << "&, const " << name << "&);";
     H << nl << "bool operator<(const " << name << "&, const " << name << "&);";
+
+    H << sp;
+
+    if(!p->isLocal())
+    {
+        H << nl << _dllExport << "::Ice::Object* upCast(" << scoped << "*);";
+    }
+    else
+    {
+        H << nl << _dllExport << "::Ice::LocalObject* upCast(" << scoped << "*);";
+    }
 }
 
 void
@@ -4922,13 +4936,13 @@
 {
     if((BuiltinPtr::dynamicCast(p) && BuiltinPtr::dynamicCast(p)->kind() == Builtin::KindObject)
        || ClassDeclPtr::dynamicCast(p))
-    {
-        C << nl << "if(" << prefix << name << ')';
+    {        C << nl << "if(" << prefix << name << ')';
         C << sb;
         ClassDeclPtr decl = ClassDeclPtr::dynamicCast(p);
         if(decl)
         {
-            C << nl << "::IceInternal::upCast(" << prefix << name << ".get())->__addObject(_c);";
+            string scope = fixKwd(decl->scope());
+            C << nl << scope << "upCast(" << prefix << name << ".get())->__addObject(_c);";
         }
         else
         {
@@ -4991,9 +5005,10 @@
         ClassDeclPtr decl = ClassDeclPtr::dynamicCast(p);
         if(decl)
         {
-            C << nl << "if(" << "::IceInternal::upCast(" << prefix << name << ".get())->__usesClasses())";
+            string scope = fixKwd(decl->scope());
+            C << nl << "if(" << scope << "upCast(" << prefix << name << ".get())->__usesClasses())";
             C << sb;
-            C << nl << "::IceInternal::upCast(" << prefix << name << ".get())->__decRefUnsafe();";
+            C << nl << scope << "upCast(" << prefix << name << ".get())->__decRefUnsafe();";
             C << nl << prefix << name << ".__clearHandleUnsafe();";
 
         }
@@ -5629,40 +5644,30 @@
 {
     string scoped = fixKwd(p->scoped());
 
-    H << sp;
-
-    if(!p->isLocal())
-    {
-        H << nl << _dllExport << "::Ice::Object* upCast(" << scoped << "*);";
-        H << nl << _dllExport << "::IceProxy::Ice::Object* upCast(::IceProxy" << scoped << "*);";
-    }
-    else
-    {
-        H << nl << _dllExport << "::Ice::LocalObject* upCast(" << scoped << "*);";
-    }
 }
 
 bool
 Slice::Gen::IceInternalVisitor::visitClassDefStart(const ClassDefPtr& p)
 {
     string scoped = fixKwd(p->scoped());
+    string scope = fixKwd(p->scope());
 
     C << sp;
     if(!p->isLocal())
     {
         C << nl
 	  << (_dllExport.empty() ? "" : "ICE_DECLSPEC_EXPORT ")
-	  << "::Ice::Object* IceInternal::upCast(" << scoped << "* p) { return p; }";
+	  << "::Ice::Object* " << scope << "upCast(" << scoped << "* p) { return p; }";
         C << nl
 	  << (_dllExport.empty() ? "" : "ICE_DECLSPEC_EXPORT ")
-	  << "::IceProxy::Ice::Object* IceInternal::upCast(::IceProxy" << scoped
+	  << "::IceProxy::Ice::Object* IceProxy" << scope << "upCast(::IceProxy" << scoped
           << "* p) { return p; }";
     }
     else
     {
         C << nl
 	  << (_dllExport.empty() ? "" : "ICE_DECLSPEC_EXPORT ")
-	  << "::Ice::LocalObject* IceInternal::upCast(" << scoped << "* p) { return p; }";
+	  << "::Ice::LocalObject* " << scope << "upCast(" << scoped << "* p) { return p; }";
     }
 
     return true;
--- a/cpp/src/slice2cs/Gen.cpp
+++ b/cpp/src/slice2cs/Gen.cpp
@@ -1281,7 +1281,7 @@
         {
             _out << value << "F";
         }
-        else if(ep = EnumPtr::dynamicCast(type))
+        else if((ep = EnumPtr::dynamicCast(type)))
         {
             string enumName = fixId(ep->scoped());
             string::size_type colon = value.rfind(':');
@@ -3914,16 +3914,6 @@
     ClassDefPtr cl = ClassDefPtr::dynamicCast(p->container());
     string name = fixId(p->name(), DotNet::ICloneable, true);
     vector<string> params = getParams(p);
-    bool hasOutParams = false;
-    ParamDeclList paramList = p->parameters();
-    for(ParamDeclList::const_iterator pli = paramList.begin(); pli != paramList.end(); ++pli)
-    {
-        if((*pli)->isOutParam())
-        {
-            hasOutParams = true;
-            break;
-        }
-    }
 
     _out << sp;
 
--- a/cpp/src/slice2java/Gen.cpp
+++ b/cpp/src/slice2java/Gen.cpp
@@ -1246,7 +1246,7 @@
     {
         BuiltinPtr bp;
         EnumPtr ep;
-        if(bp = BuiltinPtr::dynamicCast(type))
+        if((bp = BuiltinPtr::dynamicCast(type)))
         {
             switch(bp->kind())
             {
@@ -1349,7 +1349,7 @@
             }
 
         }
-        else if(ep = EnumPtr::dynamicCast(type))
+        else if((ep = EnumPtr::dynamicCast(type)))
         {
             string val = value;
             string::size_type pos = val.rfind(':');
--- a/cpp/test/Glacier2/ssl/Server.cpp
+++ b/cpp/test/Glacier2/ssl/Server.cpp
@@ -31,9 +31,15 @@
         test(ctx["_con.type"] == "ssl");
         test(ctx["_con.localPort"] == "12348");
     }
-    test(ctx["_con.localAddress"] == "127.0.0.1");
+    if (!inFreeBSDJail())
+    {
+        test(ctx["_con.localAddress"] == "127.0.0.1");
+    }
     test(ctx["_con.remotePort"] != "");
-    test(ctx["_con.remoteAddress"] == "127.0.0.1");
+    if (!inFreeBSDJail())
+    {
+        test(ctx["_con.remoteAddress"] == "127.0.0.1");
+    }
 }
 
 }
@@ -99,7 +105,7 @@
     }
 
     virtual void
-    ice_ping(const Ice::Current& current)
+    ice_ping(const Ice::Current& current) const
     {
         testContext(_ssl, current.ctx);
     }
@@ -133,8 +139,11 @@
     {
         testContext(true, current.ctx);
 
-        test(info.remoteHost == "127.0.0.1");
-        test(info.localHost == "127.0.0.1");
+        if (!inFreeBSDJail())
+        {
+            test(info.remoteHost == "127.0.0.1");
+            test(info.localHost == "127.0.0.1");
+        }
         test(info.localPort == 12348);
 
         try
--- a/cpp/test/Ice/background/EndpointI.h
+++ b/cpp/test/Ice/background/EndpointI.h
@@ -48,7 +48,7 @@
 
     virtual Ice::Int hashInit() const;
 #if !defined(_MSC_VER) || _MSC_VER > 1300
-    using IceInternal::EndpointI::connectors;
+    using ::IceInternal::EndpointI::connectors;
 #endif
     
 private:
--- a/cpp/test/Ice/custom/AllTests.cpp
+++ b/cpp/test/Ice/custom/AllTests.cpp
@@ -1384,7 +1384,8 @@
                        const ::Test::ClassStructSeq& seq,
                        const InParamPtr& cookie)
     {
-        pair< ::Test::ClassStructPtr, ::Test::ClassStructSeq> in = getIn(in, cookie);
+        pair< ::Test::ClassStructPtr, ::Test::ClassStructSeq> in;
+        in = getIn(in, cookie);
         test(ret == in.first);
         test(cs1 == in.first);
         test(seq == in.second);
@@ -1432,7 +1433,8 @@
 
     void throwExcept1(const Ice::AsyncResultPtr& result)
     {
-        wstring in = getIn(in, InParamPtr::dynamicCast(result->getCookie()));
+        wstring in;
+        in = getIn(in, InParamPtr::dynamicCast(result->getCookie()));
         try
         {
             Test1::WstringClassPrx t = Test1::WstringClassPrx::uncheckedCast(result->getProxy());
@@ -1451,7 +1453,8 @@
 
     void throwExcept2(const Ice::AsyncResultPtr& result)
     {
-        wstring in = getIn(in, InParamPtr::dynamicCast(result->getCookie()));
+        wstring in;
+        in = getIn(in, InParamPtr::dynamicCast(result->getCookie()));
         try
         {
             Test2::WstringClassPrx t = Test2::WstringClassPrx::uncheckedCast(result->getProxy());
--- a/cpp/test/Ice/info/AllTests.cpp
+++ b/cpp/test/Ice/info/AllTests.cpp
@@ -141,9 +141,11 @@
         test(info->adapterName.empty());
         test(info->localPort > 0);
         test(info->remotePort == 12010);
-        test(info->remoteAddress == defaultHost);
-        test(info->localAddress == defaultHost);
-
+        if (!inFreeBSDJail())
+        {
+            test(info->remoteAddress == defaultHost);
+            test(info->localAddress == defaultHost);
+        }
         ostringstream os;
 
         Ice::Context ctx = testIntf->getConnectionInfoAsContext();
@@ -163,8 +165,11 @@
         test(info->adapterName.empty());
         test(info->localPort > 0);
         test(info->remotePort == 12010);
-        test(info->remoteAddress ==defaultHost);
-        test(info->localAddress == defaultHost);
+        if (!inFreeBSDJail())
+        {
+            test(info->remoteAddress == defaultHost);
+            test(info->localAddress == defaultHost);
+        }
     }
     cout << "ok" << endl;
 
--- a/cpp/test/Ice/properties/run.py
+++ b/cpp/test/Ice/properties/run.py
@@ -26,7 +26,7 @@
 #
 # Write config
 #
-configPath = u"./config/中国_client.config"
+configPath = u"./config/中国_client.config".encode("utf-8")
 
 TestUtil.createConfig(configPath, 
                       ["# Automatically generated by Ice test driver.", 
--- a/cpp/test/IceUtil/unicode/Client.cpp
+++ b/cpp/test/IceUtil/unicode/Client.cpp
@@ -15,6 +15,10 @@
 #   include <io.h>
 #endif
 
+#ifdef __FreeBSD__
+#   include <unistd.h>
+#endif
+
 using namespace IceUtil;
 using namespace std;
 
--- a/cpp/test/Slice/keyword/Client.cpp
+++ b/cpp/test/Slice/keyword/Client.cpp
@@ -73,6 +73,9 @@
     virtual void ice_response(Ice::Int)  {}
     virtual void ice_exception(const ::Ice::Exception&) {}
 };
+
+template<typename T>
+void unused(T const &) { }
    
 //
 // This section of the test is present to ensure that the C++ types
@@ -86,6 +89,7 @@
 
     _cpp_and::_cpp_auto b;
     b._cpp_default = 0;
+    unused(b);
 
     _cpp_and::deletePtr c = new _cpp_and::_cpp_delete();
     c->_cpp_else = "";
--- a/cpp/test/include/TestCommon.h
+++ b/cpp/test/include/TestCommon.h
@@ -17,6 +17,22 @@
 #include <stdlib.h>
 #endif
 
+#if defined(__FreeBSD__)
+#  include <sys/types.h>
+#  include <sys/sysctl.h>
+inline bool inFreeBSDJail()
+{
+    int jailed;
+    size_t size = sizeof(jailed);
+    return (sysctlbyname("security.jail.jailed", &jailed, &size, NULL, 0) != -1 || jailed);
+}
+#else
+inline bool inFreeBSDJail()
+{
+    return false;
+}
+#endif
+
 void
 inline testFailed(const char* expr, const char* file, unsigned int line)
 {
--- a/scripts/TestUtil.py
+++ b/scripts/TestUtil.py
@@ -74,6 +74,25 @@
 def isLinux():
     return sys.platform.startswith("linux")
 
+def isFreeBSD():
+    return sys.platform.startswith("freebsd")
+
+def sysctl(key):
+    p = subprocess.Popen("sysctl "+key, shell=1, stdout=subprocess.PIPE)
+    try:
+        result = p.communicate()[0].strip().split()[1]
+    except IndexError:
+        return 0    
+    if sys.version_info >= (3,):
+        result = str(result, sys.stdout.encoding)
+    try:
+        return int(result)
+    except ValueError:
+        return result
+
+def isFreeBSDJail():
+    return isFreeBSD() and sysctl("security.jail.jailed")
+
 def getCppCompiler():
     compiler = ""
     if os.environ.get("CPP_COMPILER", "") != "":
@@ -1590,7 +1609,15 @@
             if isDarwin() and "nodarwin" in config:
                 print "%s*** test not supported under Darwin%s" % (prefix, suffix)
                 continue
+
+            if isFreeBSD() and "nofreebsd" in config:
+                print "%s*** test not supported under FreeBSD%s" % (prefix, suffix)
+                continue
             
+            if isFreeBSDJail() and "nofreebsdjail" in config:
+                print "%s*** test not supported within a FreeBSD Jail%s" % (prefix, suffix)
+                continue
+
             if not isWin32() and "win32only" in config:
                 print "%s*** test only supported under Win32%s" % (prefix, suffix)
                 continue
