--- a/OSSEval/OpenSourceProject/models.py
+++ b/OSSEval/OpenSourceProject/models.py
@@ -6,10 +6,10 @@
 from ohloh import OhlohProxy
 from flossmole import FSF, FC, GC, GH
 from utils import Forges
+from OSSEval.utils import xmlMinidom
 
 class OSProject(models.Model):
     """
-    Must be the same name of the Django app                         ??????????????????????????????????????
     """
     name = models.CharField(max_length=200)
     instance = models.OneToOneField('analysis.Instance', related_name='actual_instance', primary_key=True)
@@ -17,6 +17,23 @@
     def __str__(self):
         return self.name + " - " + self.instance.name
     
+    def to_xml(self):
+        str_xml = "<OSProjectForges>"
+        for osprojectforge in self.osprojectforge_set.all():
+            str_xml += osprojectforge.to_xml()
+        str_xml += "</OSProjectForges>"
+        return '<OSProject Name="' + self.name + '">' + str_xml + "</OSProject>"
+    
+    def from_xml(self, xmldoc, instance, insert = True):
+        self.name = xmlMinidom.getStringAttribute(xmldoc, 'Name')
+        self.instance = instance
+        self.save()
+        #OSProjectForge
+        xml_osproject_forges = xmldoc.getElementsByTagName('OSProjectForge')
+        for xml_osproject_forge in xml_osproject_forges:
+            ospf = OSProjectForge()
+            ospf.from_xml(xml_osproject_forge, self, insert)
+
     def getInstanceInfo(self):
         '''
         Part of the required interface
@@ -107,8 +124,14 @@
     name = models.CharField(max_length=50)
     url = models.CharField(max_length=200)
     os_projects = models.ManyToManyField(OSProject, through='OSProjectForge', blank=True)
+
     def __str__(self):
         return self.name + " - " + self.url
+
+    def to_xml(self):
+        return '<Forge Id="' + str(self.id) + '" Name="' + self.name + '" URL="' + self.url + '" />'
+    #forges do not get added using xml, neither updated; they're are just a reference for OSProjectForge
+    #hence there is no "from_xml"
 
 class OSProjectForge(models.Model):
     name = models.CharField(max_length=200)
@@ -116,8 +139,27 @@
     os_project = models.ForeignKey(OSProject)
     identifier_in_forge = models.CharField(max_length=200)
     datasource_id = models.IntegerField()
+    
+    def to_xml(self):
+        str_xml = self.forge.to_xml()
+        return '<OSProjectForge Id="' + str(self.id) + '" Name="' + self.name + '" IdentifierInForge="' + str(self.identifier_in_forge) + '" DatasourceId="' + str(self.datasource_id) + '">' + str_xml + "</OSProjectForge>"
+    
+    def from_xml(self, xmldoc, os_project, insert = True):
+        if not insert:
+            self.id = xmlMinidom.getNaturalAttribute(xmldoc, 'Id')
+        self.name = xmlMinidom.getStringAttribute(xmldoc, 'Name')
+        self.identifier_in_forge = xmlMinidom.getStringAttribute(xmldoc, 'IdentifierInForge')
+        self.datasource_id = xmlMinidom.getNaturalAttribute(xmldoc, 'DatasourceId')
+        self.os_project = os_project
+        #Forge
+        xml_forge = xmldoc.getElementsByTagName('Forge')[0]
+        f = Forge.objects.get(pk=xmlMinidom.getNaturalAttribute(xml_forge, 'Id'))
+        self.forge = f
+        self.save()
+    
     def __str__(self):
         return self.name + " - " + self.forge.name
+    
     def getProjectInfo(self):
         if self.forge.id == Forges.OHLOH:
             osprojectforge_info = OhlohProxy.getProjectInfo(self.identifier_in_forge)