diff --git a/extra/yassl/include/openssl/rsa.h b/extra/yassl/include/openssl/rsa.h
index 1ab9d13b89ffcf1822a974d087c1e89640d4a8c8..fe64e655bdcbc464a4f14588b3c693347a92ae99 100644
--- a/extra/yassl/include/openssl/rsa.h
+++ b/extra/yassl/include/openssl/rsa.h
@@ -1,7 +1,7 @@
 /* rsa.h for openSSL */
 
 
-#ifndef ysSSL_rsa_h__
+#ifndef yaSSL_rsa_h__
 #define yaSSL_rsa_h__
 
 enum { RSA_F4 = 1 };
diff --git a/extra/yassl/include/openssl/ssl.h b/extra/yassl/include/openssl/ssl.h
index 1c8291c2f131cb370e5d88393df9a8504e3ff61f..8a87196b7ed780dd1983641f5d139dda2bc192fb 100644
--- a/extra/yassl/include/openssl/ssl.h
+++ b/extra/yassl/include/openssl/ssl.h
@@ -23,7 +23,7 @@
  *
  */
 
-#ifndef ysSSL_openssl_h__
+#ifndef yaSSL_openssl_h__
 #define yaSSL_openssl_h__
 
 #include <stdio.h>   /* ERR_print fp */
diff --git a/extra/yassl/include/yassl_int.hpp b/extra/yassl/include/yassl_int.hpp
index 60a78a3970efd5fcedba6886f03cc87aff4d99ee..e75294ad07359c1fc2286c80707ba7668dcdb471 100644
--- a/extra/yassl/include/yassl_int.hpp
+++ b/extra/yassl/include/yassl_int.hpp
@@ -123,8 +123,6 @@ public:
 
     friend sslFactory& GetSSL_Factory();        // singleton creator
 private:
-    static sslFactory instance_;
-
     sslFactory(const sslFactory&);              // hide copy
     sslFactory& operator=(const sslFactory&);   // and assign   
 };
@@ -216,8 +214,6 @@ public:
 
     friend Sessions& GetSessions(); // singleton creator
 private:
-    static Sessions instance_;
-
     Sessions(const Sessions&);              // hide copy
     Sessions& operator=(const Sessions&);   // and assign
 };
diff --git a/extra/yassl/include/yassl_types.hpp b/extra/yassl/include/yassl_types.hpp
index ec9e6fb7ceb8ecfc72cc38f9568f833579058b4e..66cc6aa3c68f60427b283c49a0b56b6add9e82ce 100644
--- a/extra/yassl/include/yassl_types.hpp
+++ b/extra/yassl/include/yassl_types.hpp
@@ -34,6 +34,11 @@
 
 namespace yaSSL {
 
+
+// Delete static singleton memory holders
+void CleanUp();
+
+
 // library allocation
 struct new_t {};      // yaSSL New type
 extern new_t ys;      // pass in parameter
diff --git a/extra/yassl/src/handshake.cpp b/extra/yassl/src/handshake.cpp
index d7df438b8dfa4e3cfe6f4bd8c3aa8718ac1a05d9..16c9bde20035e776e868f72ff5e819162079b579 100644
--- a/extra/yassl/src/handshake.cpp
+++ b/extra/yassl/src/handshake.cpp
@@ -648,8 +648,6 @@ void build_certHashes(SSL& ssl, Hashes& hashes)
 }
 
 
-mySTL::auto_ptr<input_buffer> null_buffer(ysDelete);
-
 // do process input requests
 mySTL::auto_ptr<input_buffer>
 DoProcessReply(SSL& ssl, mySTL::auto_ptr<input_buffer> buffered)
@@ -659,7 +657,8 @@ DoProcessReply(SSL& ssl, mySTL::auto_ptr<input_buffer> buffered)
     if (!ready) {
       // Nothing to receive after blocking wait => error
       ssl.SetError(receive_error);
-      return buffered= null_buffer;
+      buffered.reset(0);
+      return buffered;
     }
 
     // add buffered data if its there
@@ -667,10 +666,10 @@ DoProcessReply(SSL& ssl, mySTL::auto_ptr<input_buffer> buffered)
     input_buffer buffer(buffSz + ready);
     if (buffSz) {
         buffer.assign(buffered.get()->get_buffer(), buffSz);
-        buffered = null_buffer;
+        buffered.reset(0);
     }
 
-    // add new (ys) data
+    // add new data
     uint read  = ssl.getSocket().receive(buffer.get_buffer() + buffSz, ready);
     buffer.add_size(read);
     uint offset = 0;
@@ -703,11 +702,15 @@ DoProcessReply(SSL& ssl, mySTL::auto_ptr<input_buffer> buffered)
             mySTL::auto_ptr<Message> msg(mf.CreateObject(hdr.type_), ysDelete);
             if (!msg.get()) {
                 ssl.SetError(factory_error);
-                return buffered = null_buffer;
+                buffered.reset(0);
+                return buffered;
             }
             buffer >> *msg;
             msg->Process(buffer, ssl);
-            if (ssl.GetError()) return buffered = null_buffer;
+            if (ssl.GetError()) {
+                buffered.reset(0);
+                return buffered;
+            }
         }
         offset += hdr.length_ + RECORD_HEADER;
     }
diff --git a/extra/yassl/src/template_instnt.cpp b/extra/yassl/src/template_instnt.cpp
index 5ee57e76aed3851b4dd3dd36a75dc29e14ff1794..c55ca39bec2911745edaefe841062d3cc5fac84c 100644
--- a/extra/yassl/src/template_instnt.cpp
+++ b/extra/yassl/src/template_instnt.cpp
@@ -87,6 +87,8 @@ template void ysDelete<BulkCipher>(BulkCipher*);
 template void ysDelete<Digest>(Digest*);
 template void ysDelete<X509>(X509*);
 template void ysDelete<Message>(Message*);
+template void ysDelete<sslFactory>(sslFactory*);
+template void ysDelete<Sessions>(Sessions*);
 template void ysArrayDelete<unsigned char>(unsigned char*);
 template void ysArrayDelete<char>(char*);
 }
diff --git a/extra/yassl/src/yassl_int.cpp b/extra/yassl/src/yassl_int.cpp
index 740618ce701fdb7644461ef122568977fc621cd3..87d990b3506209d2218e82d19573d33e6d2a07fc 100644
--- a/extra/yassl/src/yassl_int.cpp
+++ b/extra/yassl/src/yassl_int.cpp
@@ -1361,19 +1361,31 @@ SSL_SESSION::~SSL_SESSION()
 }
 
 
-Sessions Sessions::instance_; // simple singleton
+static Sessions* sessionsInstance = 0;
 
 Sessions& GetSessions()
 {
-    return Sessions::instance_;
+    if (!sessionsInstance)
+      sessionsInstance = new (ys) Sessions;
+    return *sessionsInstance;
 }
 
 
-sslFactory sslFactory::instance_; // simple singleton
+static sslFactory* sslFactoryInstance = 0;
 
 sslFactory& GetSSL_Factory()
-{   
-    return sslFactory::instance_;
+{
+    if (!sslFactoryInstance)
+      sslFactoryInstance = new (ys) sslFactory;
+    return *sslFactoryInstance;
+}
+
+
+void CleanUp()
+{
+    TaoCrypt::CleanUp();
+    ysDelete(sslFactoryInstance);
+    ysDelete(sessionsInstance);
 }
 
 
diff --git a/extra/yassl/taocrypt/include/integer.hpp b/extra/yassl/taocrypt/include/integer.hpp
index 76034c3ae8f65fdf89d5b76039be418d6185ecdc..d3bd731e2bd71d539a56e5b654d7eecc84c86d79 100644
--- a/extra/yassl/taocrypt/include/integer.hpp
+++ b/extra/yassl/taocrypt/include/integer.hpp
@@ -275,8 +275,6 @@ private:
     AlignedWordBlock reg_;
     Sign             sign_;
 
-    static const Integer zero_;
-    static const Integer one_;
 };
 
 inline bool operator==(const Integer& a, const Integer& b) 
diff --git a/extra/yassl/taocrypt/include/misc.hpp b/extra/yassl/taocrypt/include/misc.hpp
index f705cc999705a690b208ab6b147041966e0acc61..26383d4c96b81c64e0206add040c750c9b58eb20 100644
--- a/extra/yassl/taocrypt/include/misc.hpp
+++ b/extra/yassl/taocrypt/include/misc.hpp
@@ -34,6 +34,11 @@
 
 namespace TaoCrypt {
 
+
+// Delete static singleton holders
+void CleanUp();
+
+
 // library allocation
 struct new_t {};      // TaoCrypt New type
 extern new_t tc;      // pass in parameter
diff --git a/extra/yassl/taocrypt/include/runtime.hpp b/extra/yassl/taocrypt/include/runtime.hpp
index 254e67a7f64ff6c780df7b59bbe6755c34da1c60..d9d7877bd9366abafb3542d6c277bd71900b1a94 100644
--- a/extra/yassl/taocrypt/include/runtime.hpp
+++ b/extra/yassl/taocrypt/include/runtime.hpp
@@ -25,11 +25,27 @@
 
 
 
-#if !defined(yaSSL_NEW_HPP) && defined(__GNUC__) 
-#if !(defined(__ICC) || defined(__INTEL_COMPILER))
-
+#ifndef yaSSL_NEW_HPP
 #define yaSSL_NEW_HPP
 
+
+#ifdef __sun
+
+#include <assert.h>
+
+// Handler for pure virtual functions
+namespace __Crun {
+    static void pure_error(void)
+    {
+       assert("Pure virtual method called." == "Aborted");
+    }
+} // namespace __Crun
+
+#endif // __sun
+
+
+#if defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))
+
 #if __GNUC__ > 2
 
 extern "C" {
@@ -47,6 +63,6 @@ static int __cxa_pure_virtual()
 } // extern "C"
 
 #endif // __GNUC__ > 2
-#endif // ! _ICC
-#endif // yaSSL_NEW_HPP && __GNUC__
+#endif // compiler check
+#endif // yaSSL_NEW_HPP
 
diff --git a/extra/yassl/taocrypt/src/algebra.cpp b/extra/yassl/taocrypt/src/algebra.cpp
index 45bbcfa662a6a00cfab0c14ea0d8791c4f8f8e95..8f4ce051a4391e640364d90dbf0af05269f7bdb5 100644
--- a/extra/yassl/taocrypt/src/algebra.cpp
+++ b/extra/yassl/taocrypt/src/algebra.cpp
@@ -76,7 +76,9 @@ const Integer& AbstractEuclideanDomain::Mod(const Element &a,
 const Integer& AbstractEuclideanDomain::Gcd(const Element &a,
                                             const Element &b) const
 {
-    Element g[3]={b, a};
+    mySTL::vector<Element> g(3);
+    g[0]= b;
+    g[1]= a;
     unsigned int i0=0, i1=1, i2=2;
 
     while (!Equal(g[i1], this->Identity()))
diff --git a/extra/yassl/taocrypt/src/integer.cpp b/extra/yassl/taocrypt/src/integer.cpp
index 71324b04b925232d38ac2ca0927b36084327fecf..4ade549153028ba0a0739ec62cfb1109d5b5bcac 100644
--- a/extra/yassl/taocrypt/src/integer.cpp
+++ b/extra/yassl/taocrypt/src/integer.cpp
@@ -2709,19 +2709,32 @@ unsigned int Integer::Encode(byte* output, unsigned int outputLen,
 }
 
 
-const Integer Integer::zero_;
+static Integer* zero = 0;
 
 const Integer &Integer::Zero()
 {
-    return zero_;
+    if (!zero)
+      zero = new (tc) Integer;
+    return *zero;
 }
 
 
-const Integer Integer::one_(1,2);
+static Integer* one = 0;
 
 const Integer &Integer::One()
 {
-    return one_;
+    if (!one)
+      one = new (tc) Integer(1,2);
+    return *one;
+}
+
+
+// Clean up static singleton holders, not a leak, but helpful to have gone
+// when checking for leaks
+void CleanUp()
+{
+    tcDelete(one);
+    tcDelete(zero);
 }
 
 
diff --git a/extra/yassl/taocrypt/src/template_instnt.cpp b/extra/yassl/taocrypt/src/template_instnt.cpp
index 9a3c12badfc8fa8971de63af202ff09adee0a1a6..59814d032099dd4e33a6718418c699ced2a198c7 100644
--- a/extra/yassl/taocrypt/src/template_instnt.cpp
+++ b/extra/yassl/taocrypt/src/template_instnt.cpp
@@ -41,6 +41,7 @@ template class RSA_Decryptor<RSA_BlockType2>;
 template class RSA_Encryptor<RSA_BlockType1>;
 template class RSA_Encryptor<RSA_BlockType2>;
 template void tcDelete<HASH>(HASH*);
+template void tcDelete<Integer>(Integer*);
 template void tcArrayDelete<byte>(byte*);
 template AllocatorWithCleanup<byte>::pointer StdReallocate<byte, AllocatorWithCleanup<byte> >(AllocatorWithCleanup<byte>&, byte*, AllocatorWithCleanup<byte>::size_type, AllocatorWithCleanup<byte>::size_type, bool);
 template void tcArrayDelete<word>(word*);