diff --git a/utils/resedit/data.py b/utils/resedit/data.py
new file mode 100644
index 0000000..85b9dfb
--- /dev/null
+++ b/utils/resedit/data.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python
+
+from xml.dom import minidom
+
+def load(xmlfile, tag, has_name=True, do_array=None):
+  dom = minidom.parse(xmlfile)
+  xmlNodes = dom.getElementsByTagName(tag)
+
+  dictionary = {}
+  for xmlNode in xmlNodes:
+    mdic = {}
+    # Name is stored as a property and not a node.
+    if(has_name):
+      name = xmlNode.attributes["name"].value
+
+    # Process the nodes.
+    for bignode in filter(lambda x: x.nodeType==x.ELEMENT_NODE, xmlNode.childNodes):
+      # Load the nodes.
+      section = {}
+      array   = []
+      for node in filter(lambda x: x.nodeType==x.ELEMENT_NODE,
+          bignode.childNodes):
+        if bignode.nodeName in do_array: # Big ugly hack to use list instead of array.
+          array.append(node.firstChild.data)
+        else: # Normal way (but will overwrite lists).
+          section[node.nodeName] = node.firstChild.data
+
+      if len(array) > 0:
+        mdic[bignode.nodeName] = array
+      else:
+        mdic[bignode.nodeName] = section
+
+    # Append the element to the dictionary.
+    dictionary[name] = mdic
+
+  dom.unlink()
+  return dictionary
+
+def save(xmlfile, basetag, tag, has_name=True):
+  print "TODO"
+
diff --git a/utils/resedit/data.pyc b/utils/resedit/data.pyc
new file mode 100644
index 0000000..0d44609
Binary files /dev/null and b/utils/resedit/data.pyc differ
diff --git a/utils/resedit/resedit.py b/utils/resedit/resedit.py
new file mode 100755
index 0000000..4150247
--- /dev/null
+++ b/utils/resedit/resedit.py
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+
+import space
+
+# Load the universe.
+universe = space.space()
+universe.loadSystems("../../dat/ssys.xml")
+universe.loadPlanets("../../dat/planet.xml")
+universe.debug()
+universe.window()
+
diff --git a/utils/resedit/space.glade b/utils/resedit/space.glade
new file mode 100644
index 0000000..41055f2
--- /dev/null
+++ b/utils/resedit/space.glade
@@ -0,0 +1,360 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--Generated with glade3 3.4.1 on Thu Feb  7 11:50:56 2008 -->
+<glade-interface>
+  <widget class="GtkWindow" id="winSystems">
+    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+    <property name="title" translatable="yes">Systems</property>
+    <property name="default_width">600</property>
+    <property name="default_height">420</property>
+    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <child>
+      <widget class="GtkVBox" id="vbox1">
+        <property name="visible">True</property>
+        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+        <child>
+          <widget class="GtkHPaned" id="hpaned1">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <child>
+              <widget class="GtkTreeView" id="treSystems">
+                <property name="width_request">100</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="headers_clickable">True</property>
+              </widget>
+              <packing>
+                <property name="resize">False</property>
+                <property name="shrink">True</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkLayout" id="layout1">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkLabel" id="label1">
+                    <property name="width_request">67</property>
+                    <property name="height_request">31</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Name:</property>
+                  </widget>
+                  <packing>
+                    <property name="x">31</property>
+                    <property name="y">26</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkEntry" id="inpName">
+                    <property name="width_request">134</property>
+                    <property name="height_request">20</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="truncate_multiline">True</property>
+                  </widget>
+                  <packing>
+                    <property name="x">95</property>
+                    <property name="y">31</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="labPos">
+                    <property name="width_request">65</property>
+                    <property name="height_request">25</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">X,Y</property>
+                  </widget>
+                  <packing>
+                    <property name="x">242</property>
+                    <property name="y">28</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkButton" id="butRepos">
+                    <property name="width_request">75</property>
+                    <property name="height_request">33</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Reposition</property>
+                    <property name="response_id">0</property>
+                  </widget>
+                  <packing>
+                    <property name="x">319</property>
+                    <property name="y">23</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label2">
+                    <property name="width_request">103</property>
+                    <property name="height_request">28</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Interference</property>
+                  </widget>
+                  <packing>
+                    <property name="x">19</property>
+                    <property name="y">75</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkHSeparator" id="hseparator1">
+                    <property name="width_request">402</property>
+                    <property name="height_request">20</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                  </widget>
+                  <packing>
+                    <property name="x">6</property>
+                    <property name="y">55</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkSpinButton" id="spiInterference">
+                    <property name="width_request">74</property>
+                    <property name="height_request">20</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="adjustment">0 0 100 1 10 10</property>
+                  </widget>
+                  <packing>
+                    <property name="x">117</property>
+                    <property name="y">79</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label3">
+                    <property name="width_request">75</property>
+                    <property name="height_request">20</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Asteroids</property>
+                  </widget>
+                  <packing>
+                    <property name="x">29</property>
+                    <property name="y">114</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkSpinButton" id="spiAsteroids">
+                    <property name="width_request">72</property>
+                    <property name="height_request">20</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="adjustment">0 0 100 1 10 10</property>
+                  </widget>
+                  <packing>
+                    <property name="x">119</property>
+                    <property name="y">113</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label4">
+                    <property name="width_request">68</property>
+                    <property name="height_request">20</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Stars</property>
+                  </widget>
+                  <packing>
+                    <property name="x">32</property>
+                    <property name="y">144</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkSpinButton" id="spiStars">
+                    <property name="width_request">73</property>
+                    <property name="height_request">20</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="adjustment">0 0 100 1 10 10</property>
+                  </widget>
+                  <packing>
+                    <property name="x">120</property>
+                    <property name="y">143</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkVSeparator" id="vseparator1">
+                    <property name="width_request">20</property>
+                    <property name="height_request">259</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                  </widget>
+                  <packing>
+                    <property name="x">202</property>
+                    <property name="y">72</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkDrawingArea" id="draSpace">
+                    <property name="width_request">180</property>
+                    <property name="height_request">171</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                  </widget>
+                  <packing>
+                    <property name="x">221</property>
+                    <property name="y">88</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkHSeparator" id="hseparator2">
+                    <property name="width_request">204</property>
+                    <property name="height_request">20</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                  </widget>
+                  <packing>
+                    <property name="x">5</property>
+                    <property name="y">169</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkTreeView" id="treJumps">
+                    <property name="width_request">193</property>
+                    <property name="height_request">86</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="headers_clickable">True</property>
+                  </widget>
+                  <packing>
+                    <property name="x">10</property>
+                    <property name="y">205</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkButton" id="butAddJump">
+                    <property name="width_request">70</property>
+                    <property name="height_request">27</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Add</property>
+                    <property name="response_id">0</property>
+                  </widget>
+                  <packing>
+                    <property name="x">25</property>
+                    <property name="y">298</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkButton" id="butRmJump">
+                    <property name="width_request">70</property>
+                    <property name="height_request">29</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Delete</property>
+                    <property name="response_id">0</property>
+                  </widget>
+                  <packing>
+                    <property name="x">121</property>
+                    <property name="y">298</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label5">
+                    <property name="width_request">126</property>
+                    <property name="height_request">20</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Jumps</property>
+                  </widget>
+                  <packing>
+                    <property name="x">44</property>
+                    <property name="y">184</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="labSpace">
+                    <property name="width_request">100</property>
+                    <property name="height_request">20</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Space</property>
+                  </widget>
+                  <packing>
+                    <property name="x">263</property>
+                    <property name="y">69</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkHSeparator" id="hseparator3">
+                    <property name="width_request">190</property>
+                    <property name="height_request">20</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                  </widget>
+                  <packing>
+                    <property name="x">218</property>
+                    <property name="y">265</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkButton" id="butSave">
+                    <property name="width_request">87</property>
+                    <property name="height_request">38</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Save</property>
+                    <property name="response_id">0</property>
+                  </widget>
+                  <packing>
+                    <property name="x">227</property>
+                    <property name="y">290</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkButton" id="butDone">
+                    <property name="width_request">83</property>
+                    <property name="height_request">41</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Done</property>
+                    <property name="response_id">0</property>
+                  </widget>
+                  <packing>
+                    <property name="x">322</property>
+                    <property name="y">288</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="resize">True</property>
+                <property name="shrink">False</property>
+              </packing>
+            </child>
+          </widget>
+        </child>
+        <child>
+          <widget class="GtkStatusbar" id="staBottom">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="spacing">2</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+</glade-interface>
diff --git a/utils/resedit/space.py b/utils/resedit/space.py
new file mode 100644
index 0000000..8e9d72d
--- /dev/null
+++ b/utils/resedit/space.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python
+
+try:   
+  import gtk,gtk.glade
+  import gobject
+except:
+  print "You do not have python gtk bindings, or you're missing glade libs"
+  print "To use Lephisto's resedit you must install them"
+  print "http://pygtk.org/ "
+  raise SystemExit
+
+import data
+
+class space:
+
+  def __init__(self):
+     self.glade = "space.glade"
+     self.systemsXML = "../../dat/ssys.xml"
+     self.planetsXML = "../../dat/planet.xml"
+     self.loadSystems(self.systemsXML)
+     self.loadPlanets(self.planetsXML)
+
+  def loadSystems(self, xmlfile):
+    self.systems = data.load(xmlfile, "ssys", True, ["jumps","fleets","planets"])
+
+
+  def saveSystems(self, xmlfile):
+    print "TODO"
+
+
+  def loadPlanets(self, xmlfile):
+    self.planets = data.load(xmlfile, "planet", True, ["commodities"])
+
+
+  def savePlanets(self, xmlfile):
+    print "TODO"
+
+
+  def window(self):
+    """
+    create the window
+    """
+    # --------------- SYSTEMS --------------------
+    self.swtree = gtk.glade.XML(self.glade, "winSystems")
+    
+    # Hook events and stuff.
+    self.__swidget("winSystems").connect("destroy", self.__done)
+    self.__swidget("butDone").connect("clicked", self.__done)
+    self.__swidget("treSystems").connect("row-activated", self.__update)
+
+    # Populate the tree.
+    self.tree_systems = gtk.TreeStore(str)
+    for system in self.systems: # Load the planets.
+      treenode = self.tree_systems.append(None, [system])
+      for planet in self.systems[system]['planets']:
+        self.tree_systems.append(treenode, [planet])
+    col = gtk.TreeViewColumn('Systems')
+    cell = gtk.CellRendererText()
+    self.__swidget("treSystems").append_column(col)
+    col.pack_start(cell, True)
+    col.add_attribute(cell, 'text', 0)
+    self.__swidget("treSystems").set_model(self.tree_systems)
+
+    # Display the window and such.
+    self.__swidget("winSystems").show_all()
+
+    # ---------------- PLANETS --------------------
+
+    # ---------------------------------------------
+    gtk.main()
+
+
+  def __swidget(self,wgtname):
+    """
+    get a widget from the winSystems
+    """
+    return self.swtree.get_widget(wgtname)
+
+
+  def __update(self, wgt=None, foo=None, bar=None):
+    """
+    Update the window
+    """
+    # Important thingies.
+    tree = self.__swidget("treSystems")
+    model = tree.get_model()
+
+    # Get system.
+    sel = model.iter_nth_child(None, foo[0])
+    sys_name = model.get_value( sel, 0 )
+    system = self.systems[sys_name]
+
+    # Load it all.
+    dic = {
+        "inpName":sys_name,
+        "spiInterference":system["general"]["interference"],
+        "spiAsteroids":system["general"]["asteroids"],
+        "spiStars":system["general"]["stars"],
+        "labPos":"%s,%s" % (system["pos"]["x"],system["pos"]["y"])
+    }
+    for key, value in dic.items():
+      self.__swidget(key).set_text(value)
+
+    # Load jumps.
+
+    jumps = gtk.ListStore(str)
+    for jump in system["jumps"]: # Load the planets.
+      treenode = jumps.append([jump])
+    col = gtk.TreeViewColumn('Jumps')
+    cell = gtk.CellRendererText()
+    wgt = self.__swidget("treJumps")
+    if wgt.get_column(0):
+      wgt.remove_column( wgt.get_column(0) )
+    wgt.append_column(col)
+    col.pack_start(cell, True)
+    col.add_attribute(cell, 'text', 0)
+    wgt.set_model(jumps)
+
+  def __done(self, widget=None, data=None):
+    """
+    Window is done
+    """
+    gtk.main_quit()
+
+  def debug(self):
+    print "SYSTEMS LOADED:"
+    print self.systems
+    print
+    print
+    print "PLANETS LOADED:"
+    print self.planets
+
diff --git a/utils/resedit/space.pyc b/utils/resedit/space.pyc
new file mode 100644
index 0000000..1acd9b0
Binary files /dev/null and b/utils/resedit/space.pyc differ