diff --git a/global.h b/global.h
index 907b9fb..65b1bf4 100644
--- a/global.h
+++ b/global.h
@@ -1,7 +1,30 @@
 #ifndef GLOBAL_H
 #define GLOBAL_H

+#include <cstddef>
+#include <iomanip>
+#include <iostream>
+#include <fstream>
+#include <string>

+#include <boost/archive/tmpdir.hpp>

+#include <boost/archive/xml_iarchive.hpp>
+#include <boost/archive/xml_oarchive.hpp>
+
+#include <boost/serialization/base_object.hpp>
+#include <boost/serialization/utility.hpp>
+#include <boost/serialization/list.hpp>
+#include <boost/serialization/assume_abstract.hpp>
+
+using boost::archive::xml_oarchive;
+using boost::archive::xml_iarchive;
+using std::string;
+using std::ostream;
+using std::list;
+using std::ofstream;
+using std::ifstream;
+using std::cout;
+using std::endl;

 #endif
This file used to provide header files and namespaces
diff --git a/obj_cmd.h b/obj_cmd.h
index e69de29..99ceb5e 100644
--- a/obj_cmd.h
+++ b/obj_cmd.h
@@ -0,0 +1,28 @@
+#ifndef OBJ_CMD_H
+#define OBJ_CMD_H
+
+#include "./global.h"
+
+class OBJ_CMD {
+public:
+    OBJ_CMD() {};
+    OBJ_CMD(string name_, string help_, int num_to_test_) :
+        name(name_), help(help_), num_to_test(num_to_test_)
+    {}
+    ~OBJ_CMD(){};
+private:
+    string name;
+    string help;
+    int num_to_test;
+private:
+    friend ostream & operator << (ostream &os, const OBJ_CMD &oc);
+    friend class boost::serialization::access;
+    template <class Archive>
+    void serialize(Archive &ar, const unsigned int) {
+        ar & BOOST_SERIALIZATION_NVP(name)
+            & BOOST_SERIALIZATION_NVP(help)
+            & BOOST_SERIALIZATION_NVP(num_to_test);
+    }
+};
+
+#endif
This file used to provide object's command
This file provide Component infomation.
diff --git a/component.h b/component.h
index 4e41ae0..8651ee5 100644
--- a/component.h
+++ b/component.h
@@ -1,7 +1,32 @@
 #ifndef COMPONENT_H
 #define COMPONENT_H

+#include "./obj_cmd.h"

-
+class COMPONENT {
+public:
+    COMPONENT() {};
+    virtual ~COMPONENT() {};
+protected:
+    COMPONENT(const OBJ_CMD & in_, const OBJ_CMD & out_, int num_, string name_) :
+        port_in(in_), port_out(out_), port_num(num_), name(name_)
+    {}
+private:
+    OBJ_CMD port_in;
+    OBJ_CMD port_out;
+    int port_num;
+    string name;
+private:
+    friend class boost::serialization::access;
+    friend ostream & operator << (ostream &os, const COMPONENT &comp);
+    virtual string description(void) const = 0;
+    template <class Archive>
+    void serialize(Archive &ar, const unsigned int version) {
+        ar & BOOST_SERIALIZATION_NVP(port_in)
+            & BOOST_SERIALIZATION_NVP(port_out)
+            & BOOST_SERIALIZATION_NVP(port_num)
+            & BOOST_SERIALIZATION_NVP(name);
+    }
+};

 #endif
diff --git a/obj_cmd.h b/obj_cmd.h
index 99ceb5e..c757971 100644
--- a/obj_cmd.h
+++ b/obj_cmd.h
@@ -15,7 +15,6 @@ private:
     string help;
     int num_to_test;
 private:
-    friend ostream & operator << (ostream &os, const OBJ_CMD &oc);
     friend class boost::serialization::access;
     template <class Archive>
     void serialize(Archive &ar, const unsigned int) {
diff --git a/component.h b/component.h
index 8651ee5..b782679 100644
--- a/component.h
+++ b/component.h
@@ -18,7 +18,6 @@ private:
     string name;
 private:
     friend class boost::serialization::access;
-    friend ostream & operator << (ostream &os, const COMPONENT &comp);
     virtual string description(void) const = 0;
     template <class Archive>
     void serialize(Archive &ar, const unsigned int version) {
@@ -29,4 +28,8 @@ private:
     }
 };

+BOOST_SERIALIZATION_ASSUME_ABSTRACT(COMPONENT)
+
+typedef COMPONENT* COMPONENT_PTR;
+
 #endif
This file provide cpu information.
diff --git a/core.h b/core.h
index 3195d82..791377a 100644
--- a/core.h
+++ b/core.h
@@ -1,6 +1,31 @@
 #ifndef CORE_H
 #define CORE_H

-
+class CORE : public COMPONENT {
+public:
+    CORE() {};
+    CORE(const OBJ_CMD in_, const OBJ_CMD out_, int num_, string name_, int eax_, int ebx_, int ecx_, int edx_) :
+        COMPONENT(in_, out_, num_, name_), eax(eax_), ebx(ebx_), ecx(ecx_), edx(edx_)
+    {}
+    ~CORE() {};
+private:
+    int eax;
+    int ebx;
+    int ecx;
+    int edx;
+private:
+    friend class boost::serialization::access;
+    template <class Archive>
+    void serialize(Archive &ar, const unsigned int version) {
+        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(COMPONENT);
+        ar & BOOST_SERIALIZATION_NVP(eax);
+        ar & BOOST_SERIALIZATION_NVP(ebx);
+        ar & BOOST_SERIALIZATION_NVP(ecx);
+        ar & BOOST_SERIALIZATION_NVP(edx);
+    }
+    virtual string description(void) const {
+        return "This is a x86 processor";
+    }
+};

 #endif
diff --git a/core.h b/core.h
index 791377a..ee3b53b 100644
--- a/core.h
+++ b/core.h
@@ -1,6 +1,8 @@
 #ifndef CORE_H
 #define CORE_H

+#include "./component.h"
+
 class CORE : public COMPONENT {
 public:
     CORE() {};
This file provide memory information.
diff --git a/memory.h b/memory.h
index fa18b52..c2b87f7 100644
--- a/memory.h
+++ b/memory.h
@@ -1,5 +1,32 @@
 #ifndef MEMORY_H
 #define MEMORY_H

+#include "./component.h"
+
+class MEMORY : public COMPONENT {
+public:
+    MEMORY() {};
+    MEMORY(const OBJ_CMD in_, const OBJ_CMD out_, int num_, string name_, int bn_, int pn_, int baddr_) :
+        COMPONENT(in_, out_, num_, name_), block_num(bn_), page_num(pn_), baseaddr(baddr_)
+    {}
+    ~MEMORY() {};
+private:
+    int block_num;
+    int page_num;
+    int baseaddr;
+private:
+    friend class boost::serialization::access;
+    template <class Archive>
+    void serialize(Archive &ar, const unsigned int version) {
+        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(COMPONENT);
+        ar & BOOST_SERIALIZATION_NVP(block_num);
+        ar & BOOST_SERIALIZATION_NVP(page_num);
+        ar & BOOST_SERIALIZATION_NVP(baseaddr);
+    }
+    virtual string description(void) const {
+        return "This is a memory";
+    }
+};
+

 #endif
This file provide framework to manange components.
diff --git a/framework.h b/framework.h
index ef8e081..1d20b74 100644
--- a/framework.h
+++ b/framework.h
@@ -1,7 +1,30 @@
 #ifndef FRAMEWORK_H
 #define FRAMEWORK_H

+#include "./component.h"

+class CORE;
+class MEMORY;
+
+class FRAMEWORK {
+public:
+    FRAMEWORK() {}
+    ~FRAMEWORK() {}
+public:
+    void append(COMPONENT_PTR comp) {
+        components.insert(components.end(), comp);
+    }
+private:
+    list<COMPONENT_PTR> components;
+private:
+    friend class boost::serialization::access;
+    template <class Archive>
+    void serialize(Archive &ar, const unsigned int version) {
+        ar.register_type(static_cast<CORE*>(NULL));
+        ar.register_type(static_cast<MEMORY*>(NULL));
+        ar & BOOST_SERIALIZATION_NVP(components);
+    }
+};

 #endif
This file used to test object's serialization to xml
#include "./framework.h"
#include "./core.h"
#include "./memory.h"

int main(int argc, char *argv[])
{
    FRAMEWORK fs;
    OBJ_CMD in("PORT_IN", "Used to receive message", 11);
    OBJ_CMD out("PORT_OUT", "Used to send message", 11);

    COMPONENT_PTR core0 = new CORE(in, out, 5, "core0", 123, 456, 789, 135);
    COMPONENT_PTR core1 = new CORE(in, out, 5, "core1", 111, 222, 333, 444);
    COMPONENT_PTR core2 = new CORE(in, out, 5, "core2", 555, 666, 777, 888);
    COMPONENT_PTR core3 = new CORE(in, out, 5, "core3", 121, 454, 787, 131);
    COMPONENT_PTR memory0 = new MEMORY(in, out, 10, "memory0", 1024, 8192, 0x40000000);

    fs.append(core0);
    fs.append(core1);
    fs.append(core2);
    fs.append(core3);
    fs.append(memory0);

    cout << "Components filled OK!" << endl << endl;

    string filename(boost::archive::tmpdir());
    filename += "/framework.xml";

    save_framework(fs, filename.c_str());
    cout << "Saving... OK!" << endl;

    FRAMEWORK new_fs;
    restore_framework(new_fs, filename.c_str());
    cout << "Restoring... OK" << endl;

    delete core0;
    delete core1;
    delete core2;
    delete core3;
    delete memory0;

    return 0;
}