--- a/src/main/java/net/timbusproject/dpes/alternative/kb/PackageUniverseBuilder.java
+++ b/src/main/java/net/timbusproject/dpes/alternative/kb/PackageUniverseBuilder.java
@@ -18,12 +18,16 @@
 
 package net.timbusproject.dpes.alternative.kb;
 
+import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.Map.Entry;
+import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.concurrent.Callable;
@@ -43,12 +47,34 @@
 import org.apache.commons.cli.ParseException;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.time.DurationFormatUtils;
+import org.semanticweb.owlapi.apibinding.OWLManager;
+import org.semanticweb.owlapi.io.FileDocumentTarget;
+import org.semanticweb.owlapi.io.OWLXMLOntologyFormat;
+import org.semanticweb.owlapi.model.AddImport;
+import org.semanticweb.owlapi.model.IRI;
+import org.semanticweb.owlapi.model.OWLDataFactory;
+import org.semanticweb.owlapi.model.OWLNamedIndividual;
+import org.semanticweb.owlapi.model.OWLObjectProperty;
+import org.semanticweb.owlapi.model.OWLOntologyID;
+import org.semanticweb.owlapi.model.OWLOntologyManager;
+import org.semanticweb.owlapi.model.OWLOntologyStorageException;
+
+import uk.ac.manchester.cs.owl.owlapi.OWLOntologyImpl;
 
 /**
  * @author Rudolf Mayer
  */
 public class PackageUniverseBuilder {
 
+    public static final OWLObjectProperty OBJECTPROPERTY_CUDF_DEPENDS = OWLManager.getOWLDataFactory().getOWLObjectProperty(
+            IRI.create(VirtualPackageAlternativeIdentifier.IRI_CUDF.toString() + "#", "hasDependency"));
+
+    public static final OWLObjectProperty OBJECTPROPERTY_CUDF_CONFLICTS = OWLManager.getOWLDataFactory().getOWLObjectProperty(
+            IRI.create(VirtualPackageAlternativeIdentifier.IRI_CUDF.toString() + "#", "hasConflict"));
+
+    public static final OWLObjectProperty OBJECTPROPERTY_CUDF_RECOMMENDS = OWLManager.getOWLDataFactory().getOWLObjectProperty(
+            IRI.create(VirtualPackageAlternativeIdentifier.IRI_CUDF.toString() + "#", "hasRecommendation"));
+
     public static final String aptitudeSearchCommand = "aptitude search -F %p \".*\"";
 
     static final Logger logUniverse = Logger.getLogger("PackaUniverseBuilder");
@@ -60,17 +86,15 @@
 
         Options options = new Options();
         options.addOption(new Option("l", "loadPackages", true, "Load package information from a serialised file"));
-        options.addOption(new Option("x", "loadPackagesXML", true,
-                "Load package information from an XML serialised file"));
-        options.addOption(new Option("j", "loadPackagesJSON", true,
-                "Load package information from a JSON serialised file"));
+        options.addOption(new Option("x", "loadPackagesXML", true, "Load package information from an XML serialised file"));
+        options.addOption(new Option("j", "loadPackagesJSON", true, "Load package information from a JSON serialised file"));
 
         CommandLineParser parser = new BasicParser();
         try {
             CommandLine cmd = parser.parse(options, args);
             if (cmd.hasOption("loadPackages")) { // load the package information from the serialised file
                 String providersFileName = cmd.getOptionValue("loadPackages");
-                logUniverse.info("Trying to load package information from XML " + providersFileName);
+                logUniverse.info("Trying to load package information from Binary " + providersFileName);
                 allPackages = (SortedMap<String, Package>) new ObjectInputStream(new FileInputStream(providersFileName)).readObject();
                 logUniverse.info("\tDone, found " + allPackages.size() + " packages.");
             }
@@ -121,7 +145,7 @@
             index++;
             // check if we need to query this package
             if (allPackages.containsKey(packageName)) {
-                logUniverse.info("Not querying already loaded package " + packageName);
+                // logUniverse.info("Not querying already loaded package " + packageName);
             } else {
                 futuresList.add(eservice.submit(new PackgeDetailsTask(packageName)));
             }
@@ -141,8 +165,7 @@
         // store the results - if there were any
         if (futuresList.size() > 0) {
             long endReadingPackagesTime = System.currentTimeMillis();
-            logUniverse.info("Reading packages took "
-                    + DurationFormatUtils.formatDurationHMS(endReadingPackagesTime - startTime));
+            logUniverse.info("Reading packages took " + DurationFormatUtils.formatDurationHMS(endReadingPackagesTime - startTime));
 
             for (Future<Package> future : futuresList) {
                 Package pkg;
@@ -161,14 +184,12 @@
 
             // object serialisation
             logUniverse.info("Wrote packages to "
-                    + SerialisationUtils.writeAsBinary(allPackages,
-                            VirtualPackageAlternativeIdentifier.PATH_KNOWDLEDGE_BASE + fileName).getAbsolutePath());
+                    + SerialisationUtils.writeAsBinary(allPackages, VirtualPackageAlternativeIdentifier.PATH_KNOWDLEDGE_BASE + fileName).getAbsolutePath());
 
             // save packages as JSON
             try {
                 logUniverse.info("Wrote packages to "
-                        + SerialisationUtils.writeAsJSON(allPackages,
-                                VirtualPackageAlternativeIdentifier.PATH_KNOWDLEDGE_BASE, fileName, true).getAbsolutePath());
+                        + SerialisationUtils.writeAsJSON(allPackages, VirtualPackageAlternativeIdentifier.PATH_KNOWDLEDGE_BASE, fileName, true).getAbsolutePath());
             } catch (FileNotFoundException e1) {
                 e1.printStackTrace();
             }
@@ -176,8 +197,7 @@
             // save packages in XML
             try {
                 logUniverse.info("Wrote packages to "
-                        + SerialisationUtils.writeAsXML(allPackages,
-                                VirtualPackageAlternativeIdentifier.PATH_KNOWDLEDGE_BASE, fileName, true).getAbsolutePath());
+                        + SerialisationUtils.writeAsXML(allPackages, VirtualPackageAlternativeIdentifier.PATH_KNOWDLEDGE_BASE, fileName, true).getAbsolutePath());
             } catch (FileNotFoundException e1) {
                 e1.printStackTrace();
             }
@@ -189,23 +209,28 @@
         for (Package pkg : allPackages.values()) {
             // process the lines
             for (String str : pkg.getPackageInformation()) {
+                if (str.trim().length() == 0) {
+                    continue;
+                }
                 str = str.trim();
-                String[] parts = str.split(":");
-                String key = parts[0].trim();
-                if (parts.length == 1) {
+                int keyValueSeparator = str.indexOf(":");
+                if (keyValueSeparator == -1) {
+                    System.out.println("Skipping wrong str: " + str);
                     continue;
                 }
-                String value = str.substring(parts[0].length() + 1).trim();
+                // String[] parts = str.split(":");
+                String key = str.substring(0, keyValueSeparator);
+                String value = str.substring(keyValueSeparator + 1).trim();
                 if (key.equals("Package")) {
-                    pkg.setName(parts[1]);
+                    pkg.setName(value);
                 } else if (key.equals("Depends")) {
-                    pkg.setDependsString(parts[1]);
+                    pkg.setDependsString(value);
                 } else if (key.equals("Conflicts")) {
-                    pkg.setConflictsString(parts[1]);
+                    pkg.setConflictsString(value);
                 } else if (key.equals("Recommends")) {
-                    pkg.setRecommendsString(parts[1]);
+                    pkg.setRecommendsString(value);
                 } else if (key.equals("Version")) {
-                    pkg.setVersionString(parts[1]);
+                    pkg.setVersionString(value);
                 }
             }
 
@@ -213,15 +238,70 @@
                 break;
             }
         }
+
+        logUniverse.info("Parsed all packages");
 
         // do post-processing ==> after all packages are read, we can resolve the links
         for (Package pkg : allPackages.values()) {
             pkg.resolveLinks(allPackages);
         }
 
+        logUniverse.info("Resolved links between packages");
+        final String ontologyPrefix = "packageUniverse-" + OSIdentifier.getEscapedOSString();
+        OWLOntologyImpl ontology = convertToOWL(allPackages, ontologyPrefix);
+
+        logUniverse.info("Converted to OWL");
+
+        File file = new File(VirtualPackageAlternativeIdentifier.PATH_KNOWDLEDGE_BASE + ontologyPrefix + ".owl");
+        FileDocumentTarget fileDocumentTarget = new FileDocumentTarget(file);
+        try {
+            OWLManager.createOWLOntologyManager().saveOntology(ontology, new OWLXMLOntologyFormat(), fileDocumentTarget);
+            logUniverse.info("Saved to " + file.getAbsolutePath());
+        } catch (OWLOntologyStorageException e) {
+            e.printStackTrace();
+        }
+
         long totalEndTime = System.currentTimeMillis();
 
         logUniverse.info("Total duration: " + DurationFormatUtils.formatDurationHMS(totalEndTime - startTime));
+    }
+
+    public static OWLOntologyImpl convertToOWL(SortedMap<String, Package> allPackages, String ontologyPrefix) {
+
+        OWLDataFactory df = OWLManager.getOWLDataFactory();
+        OWLOntologyManager manager = OWLManager.createOWLOntologyManager(df);
+
+        IRI ontologyIRI = IRI.create(VirtualPackageAlternativeIdentifier.IRIPREFIX_KB_PACKAGE_ALTERNATIVES + ontologyPrefix + ".owl");
+        OWLOntologyImpl ontology = new OWLOntologyImpl(manager, new OWLOntologyID(ontologyIRI));
+        manager.applyChange(new AddImport(ontology, df.getOWLImportsDeclaration(VirtualPackageAlternativeIdentifier.IRI_CUDF)));
+
+        final Set<Entry<String, Package>> entrySet = allPackages.entrySet();
+        for (Entry<String, Package> entry : entrySet) {
+            // 1. create the package
+            // 1. I.) individual creation & create class assertion (CUDF#Package)
+            OWLNamedIndividual packageIndiv = OWLUtils.createAndRegisterIndividual(ontologyIRI.toString(), entry.getKey(),
+                    VirtualPackageAlternativeIdentifier.CLASS_CUDF_PACKAGE, df, manager, ontology);
+
+            createRelations(df, manager, ontologyIRI, ontology, packageIndiv, entry.getValue().getDepends(), OBJECTPROPERTY_CUDF_DEPENDS);
+            createRelations(df, manager, ontologyIRI, ontology, packageIndiv, entry.getValue().getConflicts(), OBJECTPROPERTY_CUDF_CONFLICTS);
+            createRelations(df, manager, ontologyIRI, ontology, packageIndiv, entry.getValue().getRecommends(), OBJECTPROPERTY_CUDF_RECOMMENDS);
+        }
+
+        // System.out.println("\tDone!");
+
+        return ontology;
+    }
+
+    public static void createRelations(OWLDataFactory df, OWLOntologyManager manager, IRI ontologyIRI, OWLOntologyImpl ontology,
+            OWLNamedIndividual packageIndiv, LinkedList<PackageRelation> depends, OWLObjectProperty objectproperty) {
+        for (PackageRelation relation : depends) {
+            // 2.I create the package individual
+            OWLNamedIndividual dependendPackageIndiv = OWLUtils.createAndRegisterIndividual(ontologyIRI.toString(), relation.getTargetPackageName(),
+                    VirtualPackageAlternativeIdentifier.CLASS_CUDF_PACKAGE, df, manager, ontology);
+
+            // 2.II Link the event individual to the entities
+            OWLUtils.createRelation(packageIndiv, dependendPackageIndiv, ontology, df, manager, objectproperty);
+        }
     }
 }