diff --git a/sql/inc/TBufferSQL2.h b/sql/inc/TBufferSQL2.h
index 60c275fcdc95a4f48e51f8ce7db5a6b5d96469c6..e7c8c5014b8c240865e6c1e4877d24f6a280b1d5 100644
--- a/sql/inc/TBufferSQL2.h
+++ b/sql/inc/TBufferSQL2.h
@@ -1,4 +1,4 @@
-// @(#)root/sql:$Name:  $:$Id: TBufferSQL2.h,v 1.5 2005/12/02 23:23:36 pcanal Exp $
+// @(#)root/sql:$Name:  $:$Id: TBufferSQL2.h,v 1.6 2005/12/07 14:59:57 rdm Exp $
 // Author: Sergey Linev  20/11/2005
 
 
@@ -132,8 +132,7 @@ class TBufferSQL2 : public TBuffer {
       TSQLStructure*   SqlWrite(const TObject* obj, Int_t objid);
       TSQLStructure*   SqlWrite(const void* obj, const TClass* cl, Int_t objid);
 
-      TObject*         SqlRead(Int_t objid);
-      void*            SqlReadAny(Int_t objid, TClass** cl);
+      void*            SqlReadAny(Int_t objid, void* obj, TClass** cl);
 
       // suppress class writing/reading
 
diff --git a/sql/inc/TKeySQL.h b/sql/inc/TKeySQL.h
index 24402d1d05e4056929d4a4833753783ba437e2a3..492f532238a91716cf8766a65f6f7af2cacbfebe 100644
--- a/sql/inc/TKeySQL.h
+++ b/sql/inc/TKeySQL.h
@@ -1,4 +1,4 @@
-// @(#)root/sql:$Name:  $:$Id: TKeySQL.h,v 1.2 2005/11/22 20:42:36 pcanal Exp $
+// @(#)root/sql:$Name:  $:$Id: TKeySQL.h,v 1.3 2005/12/07 14:59:57 rdm Exp $
 // Author: Sergey Linev  20/11/2005
 
 /*************************************************************************
@@ -34,6 +34,7 @@ protected:
 
    virtual Int_t     Read(const char *name) { return TKey::Read(name); }
    void              StoreObject(const void* obj, const TClass* cl);
+   void*             SqlReadAny(void* obj, const TClass* expectedClass);
   
    TSQLFile*         fFile;     //!  pointer on SQL file
    Int_t             fKeyId;    //!  key identifier in KeysTables
@@ -61,16 +62,16 @@ public:
    virtual Long64_t  GetSeekPdir() const { return 1;}
    virtual void      Keep() {}
 
-   virtual Int_t     Read(TObject*) { return 0; }
+   virtual Int_t     Read(TObject* obj);
    virtual TObject  *ReadObj();
-   virtual void     *ReadObjectAny(const TClass *cl);
+   virtual void     *ReadObjectAny(const TClass *expectedClass);
   
    virtual void      ReadBuffer(char *&) {}
    virtual void      ReadFile() {}
    virtual void      SetBuffer() { fBuffer = 0; }
    virtual void      SetParent(const TObject* ) { }
    virtual Int_t     Sizeof() const { return 0; }
-   virtual Int_t     WriteFile(Int_t =1) { return 0; }
+   virtual Int_t     WriteFile(Int_t =1, TFile* = 0) { return 0; }
 
    ClassDef(TKeySQL,1) // a special TKey for SQL data base
 };
diff --git a/sql/src/TBufferSQL2.cxx b/sql/src/TBufferSQL2.cxx
index 634fa95da6c72e4a715c18589c84660b7da3354b..6ff6667e26013538a4395ecc708fccaf254c4b23 100644
--- a/sql/src/TBufferSQL2.cxx
+++ b/sql/src/TBufferSQL2.cxx
@@ -1,4 +1,4 @@
-// @(#)root/sql:$Name:  $:$Id: TBufferSQL2.cxx,v 1.6 2005/12/02 23:23:36 pcanal Exp $
+// @(#)root/sql:$Name:  $:$Id: TBufferSQL2.cxx,v 1.7 2005/12/07 14:59:57 rdm Exp $
 // Author: Sergey Linev  20/11/2005
 
 /*************************************************************************
@@ -155,26 +155,7 @@ TSQLStructure* TBufferSQL2::SqlWrite(const void* obj, const TClass* cl, Int_t ob
 }
 
 //______________________________________________________________________________
-TObject* TBufferSQL2::SqlRead(Int_t objid)
-{
-   // Recreate object from sql structure.
-   // Return pointer to read object.
-   // If object class is not inherited from TObject,
-   // object is deleted and function return 0
-
-   TClass* cl = 0;
-   void* obj = SqlReadAny(objid, &cl);
-
-   if ((cl!=0) && !cl->InheritsFrom(TObject::Class())) {
-      cl->Destructor(obj);
-      obj = 0;
-   }
-
-   return (TObject*) obj;
-}
-
-//______________________________________________________________________________
-void* TBufferSQL2::SqlReadAny(Int_t objid, TClass** cl)
+void* TBufferSQL2::SqlReadAny(Int_t objid, void* obj, TClass** cl)
 {
    // Recreate object from sql structure.
    // Return pointer to read object.
@@ -188,7 +169,7 @@ void* TBufferSQL2::SqlReadAny(Int_t objid, TClass** cl)
 
    fReadVersionBuffer = -1;
 
-   return SqlReadObjectDirect(0, cl, objid);
+   return SqlReadObjectDirect(obj, cl, objid);
 }
 
 //______________________________________________________________________________
diff --git a/sql/src/TKeySQL.cxx b/sql/src/TKeySQL.cxx
index b423f5144905c18c0151b04e1b23a2827ac9dbe6..ed98c66672651e41e582f85deb98cfde5ab62cae 100644
--- a/sql/src/TKeySQL.cxx
+++ b/sql/src/TKeySQL.cxx
@@ -1,4 +1,4 @@
-// @(#)root/sql:$Name:  $:$Id: TKeySQL.cxx,v 1.4 2005/12/01 16:30:43 pcanal Exp $
+// @(#)root/sql:$Name:  $:$Id: TKeySQL.cxx,v 1.5 2005/12/07 14:59:57 rdm Exp $
 // Author: Sergey Linev  20/11/2005
 
 /*************************************************************************
@@ -19,6 +19,7 @@
 
 #include "TKeySQL.h"
 
+#include "TROOT.h"
 #include "TClass.h"
 #include "TBrowser.h"
 #include "Riostream.h"
@@ -208,35 +209,70 @@ zombie:
    // delete this;
 }
 
+//______________________________________________________________________________
+Int_t TKeySQL::Read(TObject* tobj)
+{
+   // To read an object from the file.
+   // The object associated to this key is read from the file into memory.
+   // Before invoking this function, obj has been created via the
+   // default constructor.
+
+   if (tobj==0) return 0; 
+    
+   void* res = SqlReadAny(tobj, 0);
+   
+   return res==0 ? 0 : 1;
+}
+
 //______________________________________________________________________________
 TObject* TKeySQL::ReadObj()
 {
 // Read object derived from TObject class
 // If it is not TObject or in case of error, return 0
 
-   if (gDebug>0)
-      cout << "TKeySQL::ReadObj fKeyId = " << fKeyId << endl;
-
-   if ((fKeyId<=0) || (fFile==0)) return 0;
-
-   TBufferSQL2 buffer(TBuffer::kRead, fFile);
-
-   TObject* obj = buffer.SqlRead(fObjId);
-
-   return obj;
+   TObject* tobj = (TObject*) SqlReadAny(0, TObject::Class());
+   
+   if ((tobj!=0) && gROOT->GetForceStyle()) tobj->UseCurrentStyle();
+       
+   return tobj;
 }
 
 //______________________________________________________________________________
-void* TKeySQL::ReadObjectAny(const TClass* /*cl*/)
+void* TKeySQL::ReadObjectAny(const TClass* expectedClass)
 {
 // read object of any type from SQL database
 
+   return SqlReadAny(0, expectedClass);
+}
+
+//______________________________________________________________________________
+void* TKeySQL::SqlReadAny(void* obj, const TClass* expectedClass)
+{
    if ((fKeyId<=0) || (fFile==0)) return 0;
 
    TBufferSQL2 buffer(TBuffer::kRead, fFile);
+   
+   TClass* cl = 0;
 
-   void* obj = buffer.SqlReadAny(fObjId, 0);
-
-   return obj;
+   void* res = buffer.SqlReadAny(fObjId, obj, &cl);
+   
+   if ((cl==0) || (res==0)) return 0;
+   
+   Int_t delta = 0;
+   
+   if (expectedClass!=0) {
+      delta = cl->GetBaseClassOffset(expectedClass);
+      if (delta<0) {
+         if (obj==0) cl->Destructor(res);
+         return 0;
+      }
+      if (cl->GetClassInfo() && !expectedClass->GetClassInfo()) {
+         //we cannot mix a compiled class with an emulated class in the inheritance
+         Warning("XmlReadAny",
+                 "Trying to read an emulated class (%s) to store in a compiled pointer (%s)",
+                 cl->GetName(),expectedClass->GetName());
+      }
+   }
+   
+   return ((char*)res) + delta;
 }
-
diff --git a/sql/src/TSQLFile.cxx b/sql/src/TSQLFile.cxx
index 2e9101ff419bb724b4fdb623497a87fb81365398..22ae48dd7801bbc91b5e015e76128dc56b96d2c7 100644
--- a/sql/src/TSQLFile.cxx
+++ b/sql/src/TSQLFile.cxx
@@ -1,4 +1,4 @@
-// @(#)root/sql:$Name:  $:$Id: TSQLFile.cxx,v 1.4 2005/11/28 23:22:31 pcanal Exp $
+// @(#)root/sql:$Name:  $:$Id: TSQLFile.cxx,v 1.5 2005/12/07 14:59:57 rdm Exp $
 // Author: Sergey Linev  20/11/2005
 
 /*************************************************************************
@@ -963,38 +963,6 @@ TList* TSQLFile::GetStreamerInfoList()
    // Hopefully, problem will be solved soon
 
    return new TList;
-
-   if (gDebug>1)
-      Info("GetStreamerInfoList","Start reading of streamer infos");
-
-   Int_t objid = -1;
-
-   TString sqlcmd;
-   const char* quote = SQLIdentifierQuote();
-
-   sqlcmd.Form("SELECT %s%s%s FROM %s%s%s WHERE %s%s%s=%d",
-               quote, SQLObjectIdColumn(), quote,
-               quote, sqlio::KeysTable, quote,
-               quote, SQLKeyIdColumn(), quote, sqlio::Ids_StreamerInfos);
-   TSQLResult* res = SQLQuery(sqlcmd.Data(), 1);
-   TSQLRow* row = (res==0) ? 0 : res->Next();
-   if (row!=0) objid = atoi((*row)[0]);
-   delete res;
-   delete row;
-
-   if (objid<=0) return 0;
-
-   TBufferSQL2 buffer(TBuffer::kRead, this);
-
-   buffer.SetIgnoreVerification();
-
-   TObject* obj = buffer.SqlRead(objid);
-
-   TList* list = dynamic_cast<TList*> (obj);
-   if (list==0) delete obj;
-   else list->Print("*");
-
-   return list;
 }
 
 //______________________________________________________________________________
diff --git a/xml/inc/TBufferXML.h b/xml/inc/TBufferXML.h
index d98aa9efb051d56e5ebe7d18e6466eee964ddb25..6fe75862e7a904244427d06c0e50e44cbb3ce620 100644
--- a/xml/inc/TBufferXML.h
+++ b/xml/inc/TBufferXML.h
@@ -1,4 +1,4 @@
-// @(#)root/xml:$Name:  $:$Id: TBufferXML.h,v 1.3 2005/12/02 23:23:36 pcanal Exp $
+// @(#)root/xml:$Name:  $:$Id: TBufferXML.h,v 1.4 2006/01/20 01:12:13 pcanal Exp $
 // Author: Sergey Linev  10.05.2004
 
 /*************************************************************************
@@ -218,7 +218,7 @@ protected:
    XMLNodePointer_t XmlWriteAny(const void* obj, const TClass* cl);
 
    void             XmlReadBlock(XMLNodePointer_t node);
-   void*            XmlReadAny(XMLNodePointer_t node, TClass** cl);
+   void*            XmlReadAny(XMLNodePointer_t node, void* obj, TClass** cl);
 
    TXMLStackObj*    PushStack(XMLNodePointer_t current, Bool_t simple = kFALSE);
    TXMLStackObj*    PopStack();
diff --git a/xml/inc/TKeyXML.h b/xml/inc/TKeyXML.h
index 1ede2ec16c442829e2cc4af212db69b6adc99b69..2c38455bdb9e3e75166875db3d279a4874522a25 100644
--- a/xml/inc/TKeyXML.h
+++ b/xml/inc/TKeyXML.h
@@ -1,4 +1,4 @@
-// @(#)root/xml:$Name:  $:$Id: TKeyXML.h,v 1.2 2005/09/06 09:34:48 brun Exp $
+// @(#)root/xml:$Name:  $:$Id: TKeyXML.h,v 1.3 2005/11/20 05:07:41 pcanal Exp $
 // Author: Sergey Linev  10.05.2004
 
 /*************************************************************************
@@ -44,16 +44,16 @@ class TKeyXML : public TKey {
       //virtual void      ls(Option_t* ="") const;
       //virtual void      Print(Option_t* ="") const {}
 
-      virtual Int_t     Read(TObject*) { return 0; }
+      virtual Int_t     Read(TObject* tobj);
       virtual TObject  *ReadObj();
-      virtual void     *ReadObjectAny(const TClass *cl);
+      virtual void     *ReadObjectAny(const TClass *expectedClass);
       
       virtual void      ReadBuffer(char *&) {}
       virtual void      ReadFile() {}
       virtual void      SetBuffer() { fBuffer = 0; }
       virtual void      SetParent(const TObject* ) { }
       virtual Int_t     Sizeof() const { return 0; }
-      virtual Int_t     WriteFile(Int_t =1) { return 0; }
+      virtual Int_t     WriteFile(Int_t =1, TFile* = 0) { return 0; }
 
       // TKeyXML specific methods
 
@@ -67,6 +67,8 @@ class TKeyXML : public TKey {
       XMLNodePointer_t  ObjNode();
       XMLNodePointer_t  BlockNode();
       
+      void*             XmlReadAny(void* obj, const TClass* expectedClass);
+      
       TXMLFile*         fFile;     //!
       TXMLEngine*       fXML;      //!
       XMLNodePointer_t  fKeyNode;  //!
diff --git a/xml/src/TBufferXML.cxx b/xml/src/TBufferXML.cxx
index 30bce115fc918aaa95e9e0fc4e4fd05b756b73ac..c6b70f65d48d2a1a27e451b6891939dee6c337a9 100644
--- a/xml/src/TBufferXML.cxx
+++ b/xml/src/TBufferXML.cxx
@@ -1,4 +1,4 @@
-// @(#)root/:$Name:  $:$Id: TBufferXML.cxx,v 1.7 2005/12/02 23:23:36 pcanal Exp $
+// @(#)root/:$Name:  $:$Id: TBufferXML.cxx,v 1.8 2006/01/20 01:12:13 pcanal Exp $
 // Author: Sergey Linev, Rene Brun  10.05.2004
 
 /*************************************************************************
@@ -215,7 +215,7 @@ void* TBufferXML::ConvertFromXMLAny(const char* str, TClass** cl, Bool_t Generic
    
    XMLNodePointer_t xmlnode = xml.ReadSingleNode(str);
    
-   void* obj = buf.XmlReadAny(xmlnode, cl);
+   void* obj = buf.XmlReadAny(xmlnode, 0, cl);
    
    xml.FreeNode(xmlnode);
    
@@ -238,7 +238,7 @@ XMLNodePointer_t TBufferXML::XmlWriteAny(const void* obj, const TClass* cl)
 }
 
 //______________________________________________________________________________
-void* TBufferXML::XmlReadAny(XMLNodePointer_t node, TClass** cl)
+void* TBufferXML::XmlReadAny(XMLNodePointer_t node, void* obj, TClass** cl)
 {
    // Recreate object from xml structure.
    // Return pointer to read object.
@@ -253,11 +253,11 @@ void* TBufferXML::XmlReadAny(XMLNodePointer_t node, TClass** cl)
 
    PushStack(node, kTRUE);
 
-   void* obj = XmlReadObject(0, cl);
+   void* res = XmlReadObject(obj, cl);
 
    PopStack();
 
-   return obj;
+   return res;
 }
 
 //______________________________________________________________________________
@@ -1005,13 +1005,13 @@ void TBufferXML::WorkWithElement(TStreamerElement* elem, Int_t number)
 }
 
 //______________________________________________________________________________
-void TBufferXML::ClassBegin(const TClass* cl, Version_t version)
+void TBufferXML::ClassBegin(const TClass* cl, Version_t)
 {
    WorkWithClass(0, cl);
 }
 
 //______________________________________________________________________________
-void TBufferXML::ClassEnd(const TClass* cl)
+void TBufferXML::ClassEnd(const TClass*)
 {
    DecrementLevel(0);
 }
diff --git a/xml/src/TKeyXML.cxx b/xml/src/TKeyXML.cxx
index 0e03fee07b814e1404a9f13946ba9348595aa311..b4e4d94fcc9e87608106bae5999c2e070b5b54fc 100644
--- a/xml/src/TKeyXML.cxx
+++ b/xml/src/TKeyXML.cxx
@@ -1,4 +1,4 @@
-// @(#)root/xml:$Name:  $:$Id: TKeyXML.cxx,v 1.4 2005/11/22 20:42:37 pcanal Exp $
+// @(#)root/xml:$Name:  $:$Id: TKeyXML.cxx,v 1.5 2006/01/20 01:12:13 pcanal Exp $
 // Author: Sergey Linev, Rene Brun  10.05.2004
 
 /*************************************************************************
@@ -22,6 +22,7 @@
 #include "TBufferXML.h"
 #include "TXMLFile.h"
 #include "TClass.h"
+#include "TROOT.h"
 #include "TBrowser.h"
 
 ClassImp(TKeyXML);
@@ -196,42 +197,74 @@ XMLNodePointer_t TKeyXML::BlockNode()
    return 0;
 }
 
+//______________________________________________________________________________
+Int_t TKeyXML::Read(TObject* tobj)
+{
+   // To read an object from the file.
+   // The object associated to this key is read from the file into memory.
+   // Before invoking this function, obj has been created via the
+   // default constructor.
+
+   if (tobj==0) return 0; 
+    
+   void* res = XmlReadAny(tobj, 0);
+   
+   return res==0 ? 0 : 1;
+}
+
 //______________________________________________________________________________
 TObject* TKeyXML::ReadObj()
 {
    // read object derived from TObject class, from key
    // if it is not TObject or in case of error, return 0
 
-   if (fKeyNode==0) return 0;
-   TBufferXML buffer(TBuffer::kRead, fFile);
-   if (fFile->GetIOVersion()==1)
-      buffer.SetBit(TBuffer::kCannotHandleMemberWiseStreaming, kFALSE);
-   buffer.XmlReadBlock(BlockNode());
-   TClass* cl = 0;
-   void* obj = buffer.XmlReadAny(ObjNode(), &cl);
+   TObject* tobj = (TObject*) XmlReadAny(0, TObject::Class());
    
-   if ((cl==0) || (obj==0)) return 0;
-   
-   Int_t delta = cl->GetBaseClassOffset(TObject::Class());
-   
-   if (delta<0) {
-      cl->Destructor(obj);
-      return 0;
-   }
+   if ((tobj!=0) && gROOT->GetForceStyle()) tobj->UseCurrentStyle();
        
-   return (TObject*) ( ( (char*)obj ) + delta );
+   return tobj;
 }
 
 //______________________________________________________________________________
-void* TKeyXML::ReadObjectAny(const TClass* /*cl*/)
+void* TKeyXML::ReadObjectAny(const TClass *expectedClass)
 {
    // read object of any type
+   
+   return XmlReadAny(0, expectedClass);
+}
+
+//______________________________________________________________________________
+void* TKeyXML::XmlReadAny(void* obj, const TClass* expectedClass)
+{
+   // read object from key and cast to expected class
 
    if (fKeyNode==0) return 0;
+   
    TBufferXML buffer(TBuffer::kRead, fFile);
    if (fFile->GetIOVersion()==1)
       buffer.SetBit(TBuffer::kCannotHandleMemberWiseStreaming, kFALSE);
    buffer.XmlReadBlock(BlockNode());
-   void* obj = buffer.XmlReadAny(ObjNode(), 0);
-   return obj;
+
+   TClass* cl = 0;
+   void* res = buffer.XmlReadAny(ObjNode(), obj, &cl);
+   
+   if ((cl==0) || (res==0)) return 0;
+   
+   Int_t delta = 0;
+   
+   if (expectedClass!=0) {
+      delta = cl->GetBaseClassOffset(expectedClass);
+      if (delta<0) {
+         if (obj==0) cl->Destructor(res);
+         return 0;
+      }
+      if (cl->GetClassInfo() && !expectedClass->GetClassInfo()) {
+         //we cannot mix a compiled class with an emulated class in the inheritance
+         Warning("XmlReadAny",
+                 "Trying to read an emulated class (%s) to store in a compiled pointer (%s)",
+                 cl->GetName(),expectedClass->GetName());
+      }
+   }
+   
+   return ((char*)res) + delta;
 }