<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>doc/osp_manager.html</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,4 +1,4 @@
 {application,osp}.
 {packages,[]}.
-{modules,[osp,osp_admin,osp_app,osp_broker,osp_compile,osp_file,osp_mnesia,
-          osp_proto,osp_servlet,osp_socket,osp_sup,osp_web]}.
+{modules,[osp,osp_admin,osp_app,osp_broker,osp_compile,osp_file,osp_manager,
+          osp_mnesia,osp_proto,osp_servlet,osp_socket,osp_sup,osp_web]}.</diff>
      <filename>doc/edoc-info</filename>
    </modified>
    <modified>
      <diff>@@ -13,6 +13,7 @@
 &lt;tr&gt;&lt;td&gt;&lt;a href=&quot;osp_broker.html&quot; target=&quot;overviewFrame&quot; class=&quot;module&quot;&gt;osp_broker&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td&gt;&lt;a href=&quot;osp_compile.html&quot; target=&quot;overviewFrame&quot; class=&quot;module&quot;&gt;osp_compile&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td&gt;&lt;a href=&quot;osp_file.html&quot; target=&quot;overviewFrame&quot; class=&quot;module&quot;&gt;osp_file&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
+&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;osp_manager.html&quot; target=&quot;overviewFrame&quot; class=&quot;module&quot;&gt;osp_manager&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td&gt;&lt;a href=&quot;osp_mnesia.html&quot; target=&quot;overviewFrame&quot; class=&quot;module&quot;&gt;osp_mnesia&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td&gt;&lt;a href=&quot;osp_proto.html&quot; target=&quot;overviewFrame&quot; class=&quot;module&quot;&gt;osp_proto&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td&gt;&lt;a href=&quot;osp_servlet.html&quot; target=&quot;overviewFrame&quot; class=&quot;module&quot;&gt;osp_servlet&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;</diff>
      <filename>doc/modules-frame.html</filename>
    </modified>
    <modified>
      <diff>@@ -17,6 +17,7 @@
 &lt;h2&gt;&lt;a name=&quot;description&quot;&gt;Description&lt;/a&gt;&lt;/h2&gt;The exports for controlling the OSP system as a whole
 &lt;h2&gt;&lt;a name=&quot;index&quot;&gt;Function Index&lt;/a&gt;&lt;/h2&gt;
 &lt;table width=&quot;100%&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;function index&quot;&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#gen_docs-0&quot;&gt;gen_docs/0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Provides an export to regenerate the documentation with edoc.&lt;/td&gt;&lt;/tr&gt;
+&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#get_conf-1&quot;&gt;get_conf/1&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Returns the configuration for a given key.&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#join-1&quot;&gt;join/1&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Joins node to an existing OSP cluster.&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#setup-0&quot;&gt;setup/0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Setups mnesia and the OTP rel scripts for the first time.&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#start-0&quot;&gt;start/0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Starts the first 'master' node.&lt;/td&gt;&lt;/tr&gt;
@@ -30,6 +31,11 @@
 &lt;p&gt;&lt;tt&gt;gen_docs() -&amp;gt; ok&lt;/tt&gt;&lt;/p&gt;
 &lt;/div&gt;&lt;p&gt;Provides an export to regenerate the documentation with edoc&lt;/p&gt;
 
+&lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;get_conf-1&quot;&gt;get_conf/1&lt;/a&gt;&lt;/h3&gt;
+&lt;div class=&quot;spec&quot;&gt;
+&lt;p&gt;&lt;tt&gt;get_conf(Key::atom()) -&amp;gt; any()&lt;/tt&gt;&lt;/p&gt;
+&lt;/div&gt;&lt;p&gt;Returns the configuration for a given key&lt;/p&gt;
+
 &lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;join-1&quot;&gt;join/1&lt;/a&gt;&lt;/h3&gt;
 &lt;div class=&quot;spec&quot;&gt;
 &lt;p&gt;&lt;tt&gt;join(X1::list()) -&amp;gt; pong | pang&lt;/tt&gt;&lt;/p&gt;
@@ -52,6 +58,6 @@
 &lt;hr&gt;
 
 &lt;div class=&quot;navbar&quot;&gt;&lt;a name=&quot;#navbar_bottom&quot;&gt;&lt;/a&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;navigation bar&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;overview-summary.html&quot; target=&quot;overviewFrame&quot;&gt;Overview&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://www.erlang.org/&quot;&gt;&lt;img src=&quot;erlang.png&quot; align=&quot;right&quot; border=&quot;0&quot; alt=&quot;erlang logo&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
-&lt;p&gt;&lt;i&gt;Generated by EDoc, Oct 30 2009, 20:13:44.&lt;/i&gt;&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;Generated by EDoc, Nov 5 2009, 11:34:37.&lt;/i&gt;&lt;/p&gt;
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>doc/osp.html</filename>
    </modified>
    <modified>
      <diff>@@ -9,23 +9,19 @@
 &lt;hr&gt;
 
 &lt;h1&gt;Module osp_admin&lt;/h1&gt;
-&lt;ul class=&quot;index&quot;&gt;&lt;li&gt;&lt;a href=&quot;#description&quot;&gt;Description&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#index&quot;&gt;Function Index&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#functions&quot;&gt;Function Details&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Provides an interface to administer the OSP cluster.
+&lt;ul class=&quot;index&quot;&gt;&lt;li&gt;&lt;a href=&quot;#description&quot;&gt;Description&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#index&quot;&gt;Function Index&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#functions&quot;&gt;Function Details&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Provides a telnet interface to administer the OSP cluster.
 &lt;p&gt;Copyright &#169; 2009 Jacob Torrey &amp;lt;torreyji@clarkson.edu&amp;gt;&lt;/p&gt;
 
 &lt;p&gt;&lt;b&gt;Version:&lt;/b&gt; 0.4&lt;/p&gt;
 &lt;p&gt;&lt;b&gt;Authors:&lt;/b&gt; Jacob Ian Torrey (&lt;a href=&quot;mailto:torreyji@clarkson.edu&quot;&gt;&lt;tt&gt;torreyji@clarkson.edu&lt;/tt&gt;&lt;/a&gt;).&lt;/p&gt;
 
-&lt;h2&gt;&lt;a name=&quot;description&quot;&gt;Description&lt;/a&gt;&lt;/h2&gt;Provides an interface to administer the OSP cluster
+&lt;h2&gt;&lt;a name=&quot;description&quot;&gt;Description&lt;/a&gt;&lt;/h2&gt;Provides a telnet interface to administer the OSP cluster
 &lt;h2&gt;&lt;a name=&quot;index&quot;&gt;Function Index&lt;/a&gt;&lt;/h2&gt;
 &lt;table width=&quot;100%&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;function index&quot;&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#cleanup-0&quot;&gt;cleanup/0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;A callback for the OSP broker service.&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#init-0&quot;&gt;init/0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Routine for starting the master boot server and autostarted applications.&lt;/td&gt;&lt;/tr&gt;
-&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#nodeapp-0&quot;&gt;nodeapp/0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Returns the App-Node listing for the cluster.&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#proto-0&quot;&gt;proto/0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Returns the protocol for the application (this is a TCP applcation).&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#server-1&quot;&gt;server/1&lt;/a&gt;&lt;/td&gt;&lt;td&gt;The main server loop.&lt;/td&gt;&lt;/tr&gt;
-&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#shutdown_osp-0&quot;&gt;shutdown_osp/0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Shuts down the entire OSP cluster, and quits the Erlang VM.&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#start_mnesia-0&quot;&gt;start_mnesia/0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;The mnesia startup routine for osp_admin.&lt;/td&gt;&lt;/tr&gt;
-&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#stats_osp-0&quot;&gt;stats_osp/0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;This returns a string of the OSP cluster statistics.&lt;/td&gt;&lt;/tr&gt;
-&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#uptime_osp-0&quot;&gt;uptime_osp/0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Returns a human readable string of the cluster uptime.&lt;/td&gt;&lt;/tr&gt;
 &lt;/table&gt;
 
 &lt;h2&gt;&lt;a name=&quot;functions&quot;&gt;Function Details&lt;/a&gt;&lt;/h2&gt;
@@ -40,11 +36,6 @@
 &lt;p&gt;&lt;tt&gt;init() -&amp;gt; ok&lt;/tt&gt;&lt;/p&gt;
 &lt;/div&gt;&lt;p&gt;Routine for starting the master boot server and autostarted applications&lt;/p&gt;
 
-&lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;nodeapp-0&quot;&gt;nodeapp/0&lt;/a&gt;&lt;/h3&gt;
-&lt;div class=&quot;spec&quot;&gt;
-&lt;p&gt;&lt;tt&gt;nodeapp() -&amp;gt; list()&lt;/tt&gt;&lt;/p&gt;
-&lt;/div&gt;&lt;p&gt;Returns the App-Node listing for the cluster&lt;/p&gt;
-
 &lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;proto-0&quot;&gt;proto/0&lt;/a&gt;&lt;/h3&gt;
 &lt;div class=&quot;spec&quot;&gt;
 &lt;p&gt;&lt;tt&gt;proto() -&amp;gt; tcp&lt;/tt&gt;&lt;/p&gt;
@@ -55,28 +46,13 @@
 &lt;p&gt;&lt;tt&gt;server(Sock::tuple()) -&amp;gt; none()&lt;/tt&gt;&lt;/p&gt;
 &lt;/div&gt;&lt;p&gt;The main server loop&lt;/p&gt;
 
-&lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;shutdown_osp-0&quot;&gt;shutdown_osp/0&lt;/a&gt;&lt;/h3&gt;
-&lt;div class=&quot;spec&quot;&gt;
-&lt;p&gt;&lt;tt&gt;shutdown_osp() -&amp;gt; ok&lt;/tt&gt;&lt;/p&gt;
-&lt;/div&gt;&lt;p&gt;Shuts down the entire OSP cluster, and quits the Erlang VM&lt;/p&gt;
-
 &lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;start_mnesia-0&quot;&gt;start_mnesia/0&lt;/a&gt;&lt;/h3&gt;
 &lt;div class=&quot;spec&quot;&gt;
 &lt;p&gt;&lt;tt&gt;start_mnesia() -&amp;gt; ok&lt;/tt&gt;&lt;/p&gt;
 &lt;/div&gt;&lt;p&gt;The mnesia startup routine for osp_admin&lt;/p&gt;
-
-&lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;stats_osp-0&quot;&gt;stats_osp/0&lt;/a&gt;&lt;/h3&gt;
-&lt;div class=&quot;spec&quot;&gt;
-&lt;p&gt;&lt;tt&gt;stats_osp() -&amp;gt; list()&lt;/tt&gt;&lt;/p&gt;
-&lt;/div&gt;&lt;p&gt;This returns a string of the OSP cluster statistics&lt;/p&gt;
-
-&lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;uptime_osp-0&quot;&gt;uptime_osp/0&lt;/a&gt;&lt;/h3&gt;
-&lt;div class=&quot;spec&quot;&gt;
-&lt;p&gt;&lt;tt&gt;uptime_osp() -&amp;gt; list()&lt;/tt&gt;&lt;/p&gt;
-&lt;/div&gt;&lt;p&gt;Returns a human readable string of the cluster uptime&lt;/p&gt;
 &lt;hr&gt;
 
 &lt;div class=&quot;navbar&quot;&gt;&lt;a name=&quot;#navbar_bottom&quot;&gt;&lt;/a&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;navigation bar&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;overview-summary.html&quot; target=&quot;overviewFrame&quot;&gt;Overview&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://www.erlang.org/&quot;&gt;&lt;img src=&quot;erlang.png&quot; align=&quot;right&quot; border=&quot;0&quot; alt=&quot;erlang logo&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
-&lt;p&gt;&lt;i&gt;Generated by EDoc, Oct 30 2009, 20:13:45.&lt;/i&gt;&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;Generated by EDoc, Nov 5 2009, 11:34:37.&lt;/i&gt;&lt;/p&gt;
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>doc/osp_admin.html</filename>
    </modified>
    <modified>
      <diff>@@ -34,6 +34,6 @@
 &lt;hr&gt;
 
 &lt;div class=&quot;navbar&quot;&gt;&lt;a name=&quot;#navbar_bottom&quot;&gt;&lt;/a&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;navigation bar&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;overview-summary.html&quot; target=&quot;overviewFrame&quot;&gt;Overview&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://www.erlang.org/&quot;&gt;&lt;img src=&quot;erlang.png&quot; align=&quot;right&quot; border=&quot;0&quot; alt=&quot;erlang logo&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
-&lt;p&gt;&lt;i&gt;Generated by EDoc, Oct 30 2009, 20:13:44.&lt;/i&gt;&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;Generated by EDoc, Nov 5 2009, 11:34:37.&lt;/i&gt;&lt;/p&gt;
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>doc/osp_app.html</filename>
    </modified>
    <modified>
      <diff>@@ -40,6 +40,6 @@
 &lt;hr&gt;
 
 &lt;div class=&quot;navbar&quot;&gt;&lt;a name=&quot;#navbar_bottom&quot;&gt;&lt;/a&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;navigation bar&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;overview-summary.html&quot; target=&quot;overviewFrame&quot;&gt;Overview&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://www.erlang.org/&quot;&gt;&lt;img src=&quot;erlang.png&quot; align=&quot;right&quot; border=&quot;0&quot; alt=&quot;erlang logo&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
-&lt;p&gt;&lt;i&gt;Generated by EDoc, Oct 30 2009, 20:13:45.&lt;/i&gt;&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;Generated by EDoc, Nov 5 2009, 11:34:37.&lt;/i&gt;&lt;/p&gt;
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>doc/osp_broker.html</filename>
    </modified>
    <modified>
      <diff>@@ -25,7 +25,7 @@
 
 &lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;compile-1&quot;&gt;compile/1&lt;/a&gt;&lt;/h3&gt;
 &lt;div class=&quot;spec&quot;&gt;
-&lt;p&gt;&lt;tt&gt;compile(Filename::list()) -&amp;gt; {ok, list()} | {error, list()}&lt;/tt&gt;&lt;/p&gt;
+&lt;p&gt;&lt;tt&gt;compile(Filename::string()) -&amp;gt; {ok, list()} | {error, list()}&lt;/tt&gt;&lt;/p&gt;
 &lt;/div&gt;&lt;p&gt;Generates and compiles a servlet from a .sdf&lt;/p&gt;
 
 &lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;distribute-2&quot;&gt;distribute/2&lt;/a&gt;&lt;/h3&gt;
@@ -35,11 +35,11 @@
 
 &lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;servlet_to_app-1&quot;&gt;servlet_to_app/1&lt;/a&gt;&lt;/h3&gt;
 &lt;div class=&quot;spec&quot;&gt;
-&lt;p&gt;&lt;tt&gt;servlet_to_app(Filename::list()) -&amp;gt; {ok, list()} | {error, list()}&lt;/tt&gt;&lt;/p&gt;
+&lt;p&gt;&lt;tt&gt;servlet_to_app(Filename::string()) -&amp;gt; {ok, list()} | {error, list()}&lt;/tt&gt;&lt;/p&gt;
 &lt;/div&gt;&lt;p&gt;Compiles a servlet and moves it to the application directory if compilation is successful&lt;/p&gt;
 &lt;hr&gt;
 
 &lt;div class=&quot;navbar&quot;&gt;&lt;a name=&quot;#navbar_bottom&quot;&gt;&lt;/a&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;navigation bar&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;overview-summary.html&quot; target=&quot;overviewFrame&quot;&gt;Overview&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://www.erlang.org/&quot;&gt;&lt;img src=&quot;erlang.png&quot; align=&quot;right&quot; border=&quot;0&quot; alt=&quot;erlang logo&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
-&lt;p&gt;&lt;i&gt;Generated by EDoc, Oct 30 2009, 20:13:44.&lt;/i&gt;&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;Generated by EDoc, Nov 5 2009, 11:34:37.&lt;/i&gt;&lt;/p&gt;
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>doc/osp_compile.html</filename>
    </modified>
    <modified>
      <diff>@@ -32,7 +32,7 @@
 
 &lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;fopen-3&quot;&gt;fopen/3&lt;/a&gt;&lt;/h3&gt;
 &lt;div class=&quot;spec&quot;&gt;
-&lt;p&gt;&lt;tt&gt;fopen(App::list(), Filename::list(), Flags::list()) -&amp;gt; &lt;a href=&quot;#type-io_device&quot;&gt;io_device()&lt;/a&gt; | {err, list()}&lt;/tt&gt;&lt;/p&gt;
+&lt;p&gt;&lt;tt&gt;fopen(App::list(), Filename::string(), Flags::list()) -&amp;gt; &lt;a href=&quot;#type-io_device&quot;&gt;io_device()&lt;/a&gt; | {err, list()}&lt;/tt&gt;&lt;/p&gt;
 &lt;/div&gt;&lt;p&gt;Opens a file for reading or writing&lt;/p&gt;
 
 &lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;fread-2&quot;&gt;fread/2&lt;/a&gt;&lt;/h3&gt;
@@ -52,6 +52,6 @@
 &lt;hr&gt;
 
 &lt;div class=&quot;navbar&quot;&gt;&lt;a name=&quot;#navbar_bottom&quot;&gt;&lt;/a&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;navigation bar&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;overview-summary.html&quot; target=&quot;overviewFrame&quot;&gt;Overview&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://www.erlang.org/&quot;&gt;&lt;img src=&quot;erlang.png&quot; align=&quot;right&quot; border=&quot;0&quot; alt=&quot;erlang logo&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
-&lt;p&gt;&lt;i&gt;Generated by EDoc, Oct 30 2009, 20:13:45.&lt;/i&gt;&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;Generated by EDoc, Nov 5 2009, 11:34:37.&lt;/i&gt;&lt;/p&gt;
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>doc/osp_file.html</filename>
    </modified>
    <modified>
      <diff>@@ -46,6 +46,6 @@
 &lt;hr&gt;
 
 &lt;div class=&quot;navbar&quot;&gt;&lt;a name=&quot;#navbar_bottom&quot;&gt;&lt;/a&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;navigation bar&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;overview-summary.html&quot; target=&quot;overviewFrame&quot;&gt;Overview&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://www.erlang.org/&quot;&gt;&lt;img src=&quot;erlang.png&quot; align=&quot;right&quot; border=&quot;0&quot; alt=&quot;erlang logo&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
-&lt;p&gt;&lt;i&gt;Generated by EDoc, Oct 30 2009, 20:13:44.&lt;/i&gt;&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;Generated by EDoc, Nov 5 2009, 11:34:37.&lt;/i&gt;&lt;/p&gt;
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>doc/osp_mnesia.html</filename>
    </modified>
    <modified>
      <diff>@@ -19,7 +19,8 @@
 &lt;table width=&quot;100%&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;function index&quot;&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#accept-1&quot;&gt;accept/1&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Returns a function to accept a socket or connection.&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#close-1&quot;&gt;close/1&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Returns a function to close the socket.&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#set_control-1&quot;&gt;set_control/1&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Returns a function that sets the controlling process of Sock to Pid.&lt;/td&gt;&lt;/tr&gt;
-&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#start-1&quot;&gt;start/1&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Returns a function (arity 1) for starting a server socket.&lt;/td&gt;&lt;/tr&gt;
+&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#start-1&quot;&gt;start/1&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Returns a function (arity 1) for starting a server socket with default socket options.&lt;/td&gt;&lt;/tr&gt;
+&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;#start-2&quot;&gt;start/2&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Returnes a function (arity 1) for starting a server socket with passed socket options.&lt;/td&gt;&lt;/tr&gt;
 &lt;/table&gt;
 
 &lt;h2&gt;&lt;a name=&quot;functions&quot;&gt;Function Details&lt;/a&gt;&lt;/h2&gt;
@@ -36,16 +37,21 @@
 
 &lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;set_control-1&quot;&gt;set_control/1&lt;/a&gt;&lt;/h3&gt;
 &lt;div class=&quot;spec&quot;&gt;
-&lt;p&gt;&lt;tt&gt;set_control(X1) -&amp;gt; any()&lt;/tt&gt;&lt;/p&gt;
+&lt;p&gt;&lt;tt&gt;set_control(X1::tcp | udp | sctp) -&amp;gt; &lt;a href=&quot;#type-fun&quot;&gt;'fun'()&lt;/a&gt;&lt;/tt&gt;&lt;/p&gt;
 &lt;/div&gt;&lt;p&gt;Returns a function that sets the controlling process of Sock to Pid&lt;/p&gt;
 
 &lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;start-1&quot;&gt;start/1&lt;/a&gt;&lt;/h3&gt;
 &lt;div class=&quot;spec&quot;&gt;
-&lt;p&gt;&lt;tt&gt;start(X1) -&amp;gt; any()&lt;/tt&gt;&lt;/p&gt;
-&lt;/div&gt;&lt;p&gt;Returns a function (arity 1) for starting a server socket&lt;/p&gt;
+&lt;p&gt;&lt;tt&gt;start(X1::tcp | udp | sctp) -&amp;gt; &lt;a href=&quot;#type-fun&quot;&gt;'fun'()&lt;/a&gt;&lt;/tt&gt;&lt;/p&gt;
+&lt;/div&gt;&lt;p&gt;Returns a function (arity 1) for starting a server socket with default socket options&lt;/p&gt;
+
+&lt;h3 class=&quot;function&quot;&gt;&lt;a name=&quot;start-2&quot;&gt;start/2&lt;/a&gt;&lt;/h3&gt;
+&lt;div class=&quot;spec&quot;&gt;
+&lt;p&gt;&lt;tt&gt;start(X1::tcp | udp | sctp, Options::list()) -&amp;gt; &lt;a href=&quot;#type-fun&quot;&gt;'fun'()&lt;/a&gt;&lt;/tt&gt;&lt;/p&gt;
+&lt;/div&gt;&lt;p&gt;Returnes a function (arity 1) for starting a server socket with passed socket options&lt;/p&gt;
 &lt;hr&gt;
 
 &lt;div class=&quot;navbar&quot;&gt;&lt;a name=&quot;#navbar_bottom&quot;&gt;&lt;/a&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;navigation bar&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;overview-summary.html&quot; target=&quot;overviewFrame&quot;&gt;Overview&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://www.erlang.org/&quot;&gt;&lt;img src=&quot;erlang.png&quot; align=&quot;right&quot; border=&quot;0&quot; alt=&quot;erlang logo&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
-&lt;p&gt;&lt;i&gt;Generated by EDoc, Oct 30 2009, 20:13:45.&lt;/i&gt;&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;Generated by EDoc, Nov 5 2009, 11:34:37.&lt;/i&gt;&lt;/p&gt;
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>doc/osp_proto.html</filename>
    </modified>
    <modified>
      <diff>@@ -29,6 +29,6 @@
 &lt;hr&gt;
 
 &lt;div class=&quot;navbar&quot;&gt;&lt;a name=&quot;#navbar_bottom&quot;&gt;&lt;/a&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;navigation bar&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;overview-summary.html&quot; target=&quot;overviewFrame&quot;&gt;Overview&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://www.erlang.org/&quot;&gt;&lt;img src=&quot;erlang.png&quot; align=&quot;right&quot; border=&quot;0&quot; alt=&quot;erlang logo&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
-&lt;p&gt;&lt;i&gt;Generated by EDoc, Oct 30 2009, 20:13:44.&lt;/i&gt;&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;Generated by EDoc, Nov 5 2009, 11:34:37.&lt;/i&gt;&lt;/p&gt;
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>doc/osp_servlet.html</filename>
    </modified>
    <modified>
      <diff>@@ -46,6 +46,6 @@
 &lt;hr&gt;
 
 &lt;div class=&quot;navbar&quot;&gt;&lt;a name=&quot;#navbar_bottom&quot;&gt;&lt;/a&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;navigation bar&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;overview-summary.html&quot; target=&quot;overviewFrame&quot;&gt;Overview&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://www.erlang.org/&quot;&gt;&lt;img src=&quot;erlang.png&quot; align=&quot;right&quot; border=&quot;0&quot; alt=&quot;erlang logo&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
-&lt;p&gt;&lt;i&gt;Generated by EDoc, Oct 30 2009, 20:13:44.&lt;/i&gt;&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;Generated by EDoc, Nov 5 2009, 11:34:37.&lt;/i&gt;&lt;/p&gt;
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>doc/osp_socket.html</filename>
    </modified>
    <modified>
      <diff>@@ -34,6 +34,6 @@
 &lt;hr&gt;
 
 &lt;div class=&quot;navbar&quot;&gt;&lt;a name=&quot;#navbar_bottom&quot;&gt;&lt;/a&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;navigation bar&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;overview-summary.html&quot; target=&quot;overviewFrame&quot;&gt;Overview&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://www.erlang.org/&quot;&gt;&lt;img src=&quot;erlang.png&quot; align=&quot;right&quot; border=&quot;0&quot; alt=&quot;erlang logo&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
-&lt;p&gt;&lt;i&gt;Generated by EDoc, Oct 30 2009, 20:13:44.&lt;/i&gt;&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;Generated by EDoc, Nov 5 2009, 11:34:37.&lt;/i&gt;&lt;/p&gt;
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>doc/osp_sup.html</filename>
    </modified>
    <modified>
      <diff>@@ -46,6 +46,6 @@
 &lt;hr&gt;
 
 &lt;div class=&quot;navbar&quot;&gt;&lt;a name=&quot;#navbar_bottom&quot;&gt;&lt;/a&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;navigation bar&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;overview-summary.html&quot; target=&quot;overviewFrame&quot;&gt;Overview&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://www.erlang.org/&quot;&gt;&lt;img src=&quot;erlang.png&quot; align=&quot;right&quot; border=&quot;0&quot; alt=&quot;erlang logo&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
-&lt;p&gt;&lt;i&gt;Generated by EDoc, Oct 30 2009, 20:13:44.&lt;/i&gt;&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;Generated by EDoc, Nov 5 2009, 11:34:37.&lt;/i&gt;&lt;/p&gt;
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>doc/osp_web.html</filename>
    </modified>
    <modified>
      <diff>@@ -13,6 +13,6 @@ The Open Server Platform (OSP) is a framework designed to remove all but the cor
 developing highly-available, multi-threaded networked applications. 
 &lt;hr&gt;
 &lt;div class=&quot;navbar&quot;&gt;&lt;a name=&quot;#navbar_bottom&quot;&gt;&lt;/a&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; summary=&quot;navigation bar&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;overview-summary.html&quot; target=&quot;overviewFrame&quot;&gt;Overview&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://www.erlang.org/&quot;&gt;&lt;img src=&quot;erlang.png&quot; align=&quot;right&quot; border=&quot;0&quot; alt=&quot;erlang logo&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
-&lt;p&gt;&lt;i&gt;Generated by EDoc, Oct 30 2009, 20:13:45.&lt;/i&gt;&lt;/p&gt;
+&lt;p&gt;&lt;i&gt;Generated by EDoc, Nov 5 2009, 11:34:37.&lt;/i&gt;&lt;/p&gt;
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>doc/overview-summary.html</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 {application, osp,
 	      [{description, &quot;Open Server Platform&quot;},
 	      {vsn, &quot;0.4&quot;},
-	      {modules, [osp, osp_app, osp_admin, osp_broker, osp_mnesia, osp_socket, osp_proto, osp_servlet, osp_compile, osp_file, osp_sup, osp_web, osp_manager},
+	      {modules, [osp, osp_app, osp_admin, osp_broker, osp_mnesia, osp_socket, osp_proto, osp_servlet, osp_compile, osp_file, osp_sup, osp_web, osp_manager]},
 	      {registered, [osp_admin]},
 	      {applications, [kernel, sasl, stdlib, os_mon, inets]},
 	      {mod, {osp_app, []}}</diff>
      <filename>ebin/osp.app</filename>
    </modified>
    <modified>
      <diff>@@ -1,31 +1,31 @@
 % OSP Server Configuration
 
 % Use FQDNs
--define(USEFQDN, false).
+{'USEFQDN', false}.
 
 % The name of this node (if the above is true, this must be a FQDN)
--define(NODENAME, 'master@localhost').
+{'NODENAME', 'master@localhost'}.
 
 % Port the admin console should listen on
--define(ADMINPORT, 9876).
+{'ADMINPORT', 9876}.
 
 % The secret cookie
--define(COOKIE, 'AMOJDKFJHEJDHJKSJDY').
+{'COOKIE', 'AMOJDKFJHEJDHJKSJDY'}.
 
 % Auto started applications as {name, port} tuples
--define(AUTO_STARTED, []).
+{'AUTO_STARTED', [{osp_admin, 9876}]}.
 
 % Allowed diskless client IPs
--define(ALLOWED_DISKLESS, ['127.0.0.1']).
+{'ALLOWED_DISKLESS', ['127.0.0.1']}.
 
 % Whether the application filesystem is just on the master node, or shared (like NFS)
--define(SHARED_FS, false).
+{'SHARED_FS', false}.
 
 % The prefix of the application file area
--define(FS_PREFIX, &quot;/tmp&quot;).
+{'FS_PREFIX', &quot;/tmp&quot;}.
 
 % Where OSP will store the compiled applications
--define(APP_DIR, &quot;apps&quot;).
+{'APP_DIR', &quot;apps&quot;}.
 
 % Where OSP will store the application source code
--define(SRC_DIR, &quot;servlets&quot;).
+{'SRC_DIR', &quot;servlets&quot;}.</diff>
      <filename>include/conf.hrl</filename>
    </modified>
    <modified>
      <diff>@@ -2,49 +2,41 @@
 %% @author Jacob Torrey &lt;torreyji@clarkson.edu&gt;
 %% @doc The exports for controlling the OSP system as a whole
 -module(osp).
--export([start/0, stop/1, join/1, setup/0, gen_docs/0]).
-
--include(&quot;../include/conf.hrl&quot;).
+-export([start/0, stop/1, join/1, setup/0, gen_docs/0, get_conf/1]).
 
 -define(VERSION, &quot;0.4&quot;).
 
 %% @doc Starts the first 'master' node
 %% @spec start() -&gt; {ok, Pid, pid()} | {error, Reason}
 start() -&gt;
-    case ?USEFQDN of
+    case get_conf('USEFQDN') of
 	true -&gt;
-	    net_kernel:start([?NODENAME]);
+	    net_kernel:start([get_conf('NODENAME')]);
 	false -&gt;
-	    net_kernel:start([?NODENAME, shortnames])
+	    net_kernel:start([get_conf('NODENAME'), shortnames])
     end,
-    erlang:set_cookie(node(), ?COOKIE),
-    code:add_path(?APP_DIR),
+    erlang:set_cookie(node(), get_conf('COOKIE')),
+    code:add_path(get_conf('APP_DIR')),
     application:start(mnesia),
-    Pid = osp_broker:start(osp_admin, ?ADMINPORT),
-    case Pid of
-	{error, Err} -&gt;
-	    {error, Err};
-	_ -&gt;
-	    {ok, Pid, osp_web:start()}
-    end.
+    osp_manager:startup().
 
 %% @doc Stops OSP on this node
 %% @spec stop(Pid) -&gt; ok
 stop(Pid) -&gt;
-    osp_broker:stop(osp_admin),
+    osp_manager:stop_node(),
     osp_broker:shutdown(),
     osp_web:stop(Pid).
 
 %% @doc Setups mnesia and the OTP rel scripts for the first time
 %% @spec setup() -&gt; ok
 setup() -&gt;
-    case ?USEFQDN of
+    case get_conf('USEFQDN') of
 	true -&gt;
-	    net_kernel:start([?NODENAME]);
+	    net_kernel:start([get_conf('NODENAME')]);
 	false -&gt;
-	    net_kernel:start([?NODENAME, shortnames])
+	    net_kernel:start([get_conf('NODENAME'), shortnames])
     end,
-    erlang:set_cookie(node(), ?COOKIE),
+    erlang:set_cookie(node(), get_conf('COOKIE')),
     write_rel(),
     mnesia:create_schema([node()]),
     init:stop().
@@ -82,3 +74,14 @@ write_rel() -&gt;
 %% @spec gen_docs() -&gt; ok
 gen_docs() -&gt;
     edoc:application(osp, &quot;.&quot;, []).
+
+%% @doc Returns the configuration for a given key
+%% @spec get_conf(atom()) -&gt; any()
+get_conf(Key) -&gt;
+    {ok, L} = file:consult(&quot;include/conf.hrl&quot;),
+    case lists:keysearch(Key, 1, L) of
+	{value, {Key, V}} -&gt;
+	    V;
+	false -&gt;
+	    {error, keynotfound}
+    end.</diff>
      <filename>src/osp.erl</filename>
    </modified>
    <modified>
      <diff>@@ -1,34 +1,16 @@
 %% @author Jacob Ian Torrey &lt;torreyji@clarkson.edu&gt;
 %% @copyright 2009 Jacob Torrey &lt;torreyji@clarkson.edu&gt;
 %% @version 0.4
-%% @doc Provides an interface to administer the OSP cluster
+%% @doc Provides a telnet interface to administer the OSP cluster
 -module(osp_admin).
 -behavior(osp_servlet).
 
 % Export OSP server callback
 -export([start_mnesia/0, server/1, init/0, cleanup/0, proto/0]).
 
-% Export the admin functions for the web console
--export([shutdown_osp/0, stats_osp/0, uptime_osp/0, nodeapp/0]).
-
-% Include the OSP configuration
--include(&quot;../include/conf.hrl&quot;).
-
 % Import the OSP socket library
 -import(osp_socket, [send/2, recv/2, sendf/3, close/1]).
 
-% Define the Mnesia record
--record(osp_table, {key, val}).
-
-%% @doc Stores a value in the mnesia database
-%% @spec store(atom(), any()) -&gt; ok
-store(Key, Val) -&gt;
-    osp_mnesia:store(osp_admin_table, Key, Val).
-
-%% @doc Gets a value from the mnesia database
-retrieve(Key) -&gt;
-    osp_mnesia:retrieve(osp_admin_table, Key).
-
 %% @doc Returns the protocol for the application (this is a TCP applcation)
 %% @spec proto() -&gt; tcp
 proto() -&gt;
@@ -37,25 +19,8 @@ proto() -&gt;
 %% @doc The mnesia startup routine for osp_admin
 %% @spec start_mnesia() -&gt; ok
 start_mnesia() -&gt;
-    case lists:member(mnesia_sup, erlang:registered()) of
-	true -&gt;
-	    ok;
-	false -&gt;
-	    mnesia:start()
-    end,
-    case catch(mnesia:table_info(osp_admin_table, all)) of
-	{'EXIT', _} -&gt;
-	    mnesia:create_table(osp_admin_table, [{record_name, osp_table}, {disc_copies, [node()]}, {attributes, record_info(fields, osp_table)}]);
-	_ -&gt;
-	    ok
-    end,
     ok.
 
-%% @doc Returns the App-Node listing for the cluster
-%% @spec nodeapp() -&gt; list()
-nodeapp() -&gt;
-    retrieve(nodeapp).
-
 %% @doc The main server loop
 %% @spec server(tuple()) -&gt; none()
 server(Sock) -&gt;
@@ -79,14 +44,14 @@ handlecommand(Sock, Msg) -&gt;
 	&quot;help&quot; -&gt; % Print out the help message
 	    send(Sock, &lt;&lt;&quot;OSP Admin Console\n\tquit - Quits the console\n\tstats - Prints general stats about the OSP cluster\n\tstart &lt;appname&gt; &lt;port&gt; &lt;node&gt; - Starts appname on node\n\tadd-diskless-ip &lt;ip&gt; - Adds IP to the allowed diskless server pool\n\tshutdown - Shutdown OSP on all nodes\n\tadd-backup-server &lt;node&gt; &lt;type&gt; - Makes node a backup server keeping an up-to-date copy of all the shared state in the cluster; type may be ram for faster, non-persistant storage, or disk for data persistance\n\tstop &lt;appname&gt; &lt;node&gt; - Stops the given servlet on node\n\tmigrate &lt;appname&gt; &lt;fromnode&gt; &lt;tonode&gt; &lt;port&gt; - Migrates a servlet from fromnode to tonode, starting it on the given port\n&quot;&gt;&gt;);
 	&quot;stats&quot; -&gt; % Display some stats
-	    send(Sock, stats_osp());
+	    send(Sock, osp_manager:stats());
 	&quot;quit&quot; -&gt;
 	    close(Sock),
 	    exit(normal);
    	&quot;shutdown&quot; -&gt;
 	    send(Sock, &quot;Shutting down\r\n&quot;),
 	    close(Sock),
-	    shutdown_osp();
+	    osp_manager:shutdown_osp();
 	&quot;&quot; -&gt;
 	    ok;
 	Unknown -&gt; % Handle multi-word command
@@ -98,7 +63,7 @@ handlecommand(Sock, Msg) -&gt;
 		    Port = erlang:list_to_integer(PortList),
 		    App = erlang:list_to_atom(AppList),
 		    Node = erlang:list_to_atom(NodeList),
-		    case start_servlet(App, Port, Node) of
+		    case osp_mamager:start_servlet(App, Port, Node) of
 			ok -&gt;
 			    sendf(Sock, &quot;~p started on ~p port ~p~n&quot;, [App, Node, Port]);
 			error -&gt;
@@ -110,13 +75,13 @@ handlecommand(Sock, Msg) -&gt;
 		    From = erlang:list_to_atom(FromNodeList),
 		    App = erlang:list_to_atom(AppList),
 		    Node = erlang:list_to_atom(NodeList),
-		    case start_servlet(App, Port, Node) of
+		    case osp_manager:start_servlet(App, Port, Node) of
 			ok -&gt;
 			    sendf(Sock, &quot;~p started on ~p port ~p~n&quot;, [App, Node, Port]);
 			error -&gt;
 			    send(Sock, &quot;Sorry, the node you requested couldn't be found\r\n&quot;)
 		    end,
-		    case stop_servlet(App, From) of
+		    case osp_manager:stop_servlet(App, From) of
 			ok -&gt;
 			    sendf(Sock, &quot;Stopped ~p on ~p ~n&quot;, [App, Node]);
 			error -&gt;
@@ -135,11 +100,11 @@ handlecommand(Sock, Msg) -&gt;
 		    case Type of
 			ram -&gt;
 			    rpc:call(Node, mnesia, change_config, [extra_db_nodes, [node()]]),
-			    bkup_db(Node, ram_copies);
+			    osp_manager:bkup_db(Node, ram_copies);
 			disk -&gt;
 			    rpc:call(Node, mnesia, change_config, [extra_db_nodes, [node()]]),
 			    rpc:call(Node, mnesia, change_table_copy_type, [schema, Node, disc_copies]),
-			    bkup_db(Node, disc_copies);
+			    osp_manager:bkup_db(Node, disc_copies);
 			_ -&gt;
 			    send(Sock, &quot;Sorry, unknown backup type: &quot; ++ TypeL ++ &quot;\r\n&quot;)
 		    end;
@@ -147,7 +112,7 @@ handlecommand(Sock, Msg) -&gt;
 		    [Comm, AppL, NodeL] = Split,
 		    App = erlang:list_to_atom(AppL),
 		    Node = erlang:list_to_atom(NodeL),
-		    case stop_servlet(App, Node) of
+		    case osp_manager:stop_servlet(App, Node) of
 			ok -&gt;
 			    sendf(Sock, &quot;Stopped ~p on ~p ~n&quot;, [App, Node]);
 			error -&gt;
@@ -158,155 +123,12 @@ handlecommand(Sock, Msg) -&gt;
 	    end
     end.
 
-%% @todo This needs to update on every start of a new application
-%% @spec bkup_db(node(), atom()) -&gt; ok
-bkup_db(Node, Type) -&gt;
-    Tables = mnesia:system_info(tables),
-    F = fun(TableName) -&gt;
-		mnesia:add_table_copy(TableName, Node, Type),
-		rpc:call(Node, mnesia, wait_for_tables, [[TableName], 1000])
-	end,
-    lists:foreach(F, Tables),
-    ok.
-
-%% @doc Starts an appropriately typed table copy for a passed 
-%% @spec start_db(node(), atom()) -&gt; ok | error
-start_db(Node, App) -&gt;
-    TableName = erlang:list_to_atom(erlang:atom_to_list(App) ++ &quot;_table&quot;),
-    rpc:call(Node, mnesia, start, []),
-    case rpc:call(Node, init, get_argument, [loader]) of
-	error -&gt;
-	    rpc:call(Node, mnesia, change_config, [extra_db_nodes, [node()]]),
-	    rpc:call(Node, mnesia, change_table_copy_type, [schema, Node, disc_copies]),
-	    mnesia:add_table_copy(TableName, Node, disc_copies);
-	{ok, [[&quot;inet&quot;]]} -&gt;
-	    mnesia:add_table_copy(TableName, Node, ram_copies),
-	    rpc:call(Node, mnesia, change_config, [extra_db_nodes, [node()]]);
-	{ok, [[&quot;efile&quot;]]} -&gt;
-	    rpc:call(Node, mnesia, change_config, [extra_db_nodes, [node()]]),
-	    rpc:call(Node, mnesia, change_table_copy_type, [schema, Node, disc_copies]),
-	    mnesia:add_table_copy(TableName, Node, disc_copies)
-       end,
-    rpc:call(Node, mnesia, wait_for_tables, [[TableName], 1000]),
-    ok.
-
-%% @doc Returns a human readable string from a tuple version of an IP address
-%% @spec ip_to_string(tuple()) -&gt; string()
-ip_to_string({A, B, C, D}) -&gt;
-    erlang:integer_to_list(A) ++ &quot;.&quot; ++ erlang:integer_to_list(B) ++ &quot;.&quot; ++ erlang:integer_to_list(C) ++ &quot;.&quot; ++ erlang:integer_to_list(D).
-
-%% @doc Returns a string of the allowed slave IPs
-%% @spec get_ok_slaves() -&gt; string()
-get_ok_slaves() -&gt;
-    Slaves = erl_boot_server:which_slaves(),
-    Fun = fun({NM, IP}, A) -&gt;
-		  A ++ &quot;\tIP: &quot; ++ ip_to_string(IP) ++ &quot; Netmask: &quot; ++ ip_to_string(NM) ++ &quot;\r\n&quot;
-	  end,
-    lists:foldl(Fun, [], Slaves).
-
-%% @doc This returns a string of the OSP cluster statistics
-%% @spec stats_osp() -&gt; list()
-stats_osp() -&gt;
-    F = fun(Node, A) -&gt; A ++ io_lib:format(&quot;~p: ~.2f\r\n&quot;, [Node, round(100 * rpc:call(Node, cpu_sup, avg1, []) / 256) / 100]) end,
-    Out1 = &quot;Nodes in the cluster and their CPU Utilization: \r\n&quot;,
-    Out2 = lists:foldl(F, Out1, [node() | nodes()]),
-    Out2 ++ &quot;The following IPs are allowed to be diskless:\r\n&quot; ++ get_ok_slaves().
-
-%% @doc Attempts to find and stop an application on the cluster
-%% @spec stop_servlet(atom(), node()) -&gt; ok | error
-stop_servlet(App, Node) -&gt;
-    case lists:member(Node, [node() | nodes()]) of
-	true -&gt;
-	    if
-		Node =:= node() -&gt;
-		    osp_broker:stop(App);
-		true-&gt;
-		    rpc:call(Node, osp_broker, stop, [App])
-	    end,
-	    del_app_from_list(Node, App),
-	    ok;
-	false -&gt;
-	    error
-    end.
-
-%% @doc Starts a servlet application on a given node
-%% @spec start_servlet(atom(), int(), node()) -&gt; ok | error
-start_servlet(App, Port, Node) -&gt;
-    case lists:member(Node, [node() | nodes()]) of
-	true -&gt;
-	    if
-		Node =:= node() -&gt;
-		    osp_broker:start(App, Port);
-		true-&gt;
-		    start_db(Node, App),
-		    rpc:call(Node, osp_broker, start, [App, Port])
-	    end,
-	    add_app_to_list(Node, App, Port),
-	    ok;
-	false -&gt;
-	    error
-    end.
-
-%% @doc Returns a human readable string of the cluster uptime
-%% @spec uptime_osp() -&gt; list()
-uptime_osp() -&gt;
-    Seconds = retrieve(uptime),
-    NSeconds = calendar:datetime_to_gregorian_seconds(erlang:universaltime()),
-    {{_, _, Days}, {Hours, Mins, Secs}} = calendar:gregorian_seconds_to_datetime(NSeconds - Seconds),
-    erlang:integer_to_list(Days - 1) ++ &quot; days &quot; ++ erlang:integer_to_list(Hours) ++ &quot; hrs &quot; ++ erlang:integer_to_list(Mins) ++ &quot; mins &quot; ++ erlang:integer_to_list(Secs) ++ &quot; secs&quot;.
-
-%% @doc Shuts down the entire OSP cluster, and quits the Erlang VM
-%% @spec shutdown_osp() -&gt; ok
-shutdown_osp() -&gt;
-    F = fun(Node) -&gt;
-		rpc:call(Node, init, stop, [])
-	end,
-    lists:foreach(F, nodes()),
-    init:stop().
-
 %% @doc Routine for starting the master boot server and autostarted applications
 %% @spec init() -&gt; ok
 init() -&gt;
-    erl_boot_server:start(['127.0.0.1']),
-    DL = fun(IP) -&gt;
-		 erl_boot_server:add_slave(IP)
-	 end,
-    lists:foreach(DL, ?ALLOWED_DISKLESS),
-    store(uptime, calendar:datetime_to_gregorian_seconds(erlang:universaltime())),
-    case retrieve(nodeapp) of
-	undefined -&gt;
-	    store(nodeapp, [{node(), [{osp_admin, ?ADMINPORT}]}]);
-	_ -&gt;
-	    add_app_to_list(node(), osp_admin, ?ADMINPORT)
-    end,
-    F = fun({App, Port}) -&gt;
-		start_servlet(App, Port, node())
-	end,
-    lists:foreach(F, ?AUTO_STARTED),
     ok.
 
 %% @doc A callback for the OSP broker service
 %% @spec cleanup() -&gt; ok
 cleanup() -&gt;
     ok.
-
-%% @doc Deletes an application from the list of running applications
-%% @spec del_app_from_list(atom(), atom()) -&gt; ok
-del_app_from_list(Node, App) -&gt;
-    NodeApp = retrieve(nodeapp),
-    {Node, AppList} = lists:keyfind(Node, 1, NodeApp),
-    AL2 = lists:keydelete(App, 1, AppList),
-    store(nodeapp, lists:keyreplace(Node, 1, NodeApp, {Node, AL2})),
-    ok.
-
-%% @doc Adds an application to the list of running applications
-%% @spec add_app_to_list(atom(), atom(), integer()) -&gt; ok
-add_app_to_list(Node, App, Port) -&gt;
-    Nodeapp = retrieve(nodeapp),
-    case lists:keyfind(Node, 1, Nodeapp) of
-	false -&gt;
-	    store(nodeapp, [{Node, [{App, Port}]} | Nodeapp]);
-	{Node, AppList} -&gt;
-	    store(nodeapp, lists:keyreplace(Node, 1, Nodeapp, {Node, AppList ++ [{App, Port}]}))
-    end,
-    ok.</diff>
      <filename>src/osp_admin.erl</filename>
    </modified>
    <modified>
      <diff>@@ -3,8 +3,6 @@
 %% @doc Provides servlet compilation functionality
 -module(osp_compile).
 
--include(&quot;../include/conf.hrl&quot;).
-
 -export([compile/1, distribute/2, servlet_to_app/1]).
 
 %% @doc Generates and compiles a servlet from a .sdf
@@ -44,7 +42,7 @@ servlet_to_app(Filename) -&gt;
     ModuleName = string:join(lists:reverse(lists:nthtail(1, lists:reverse(string:tokens(Basename, &quot;.&quot;)))), &quot;.&quot;),
     case Compile of
 	{ok, _} = Output -&gt;
-	    file:rename(ModuleName ++ &quot;.beam&quot;, ?APP_DIR ++ &quot;/&quot; ++ ModuleName ++ &quot;.beam&quot;),
+	    file:rename(ModuleName ++ &quot;.beam&quot;, osp:get_conf('APP_DIR') ++ &quot;/&quot; ++ ModuleName ++ &quot;.beam&quot;),
 	    file:delete(ModuleName ++ &quot;.erl&quot;);
 	{error, _} = Output -&gt;
 	    file:delete(ModuleName ++ &quot;.erl&quot;)</diff>
      <filename>src/osp_compile.erl</filename>
    </modified>
    <modified>
      <diff>@@ -3,17 +3,16 @@
 %% @doc File operations for OSP programs
 -module(osp_file).
 
--include(&quot;../include/conf.hrl&quot;).
 -export([fopen/3, fread/2, fwrite/2, fclose/1, fseek/3]).
 
 %% @doc Calls a command either on the local FS, or the remote FS depending on how the FS is setup
 %% @spec call_func(atom(), atom(), list()) -&gt; any()
 call_func(M, F, A) -&gt;
-    case ?SHARED_FS of
+    case osp:get_conf('SHARED_FS') of
 	true -&gt;
 	    Ret = apply(M, F, A);
 	false -&gt;
-	    Ret = rpc:call(?NODENAME, M, F, A)
+	    Ret = rpc:call(osp:get_conf('NODENAME'), M, F, A)
     end,
     Ret.
 
@@ -21,7 +20,7 @@ call_func(M, F, A) -&gt;
 %% @spec fopen(list(), string(), list()) -&gt; io_device() | {err, list()}
 %% @todo Harden the file jailing system
 fopen(App, Filename, Flags) -&gt;
-    Filename2 = ?FS_PREFIX ++ &quot;/&quot; ++ App ++ &quot;/&quot; ++ Filename,
+    Filename2 = osp:get_conf('FS_PREFIX') ++ &quot;/&quot; ++ App ++ &quot;/&quot; ++ Filename,
     Ret = call_func(file, open, [Filename2, Flags]),
     case Ret of
 	{ok, FP} -&gt;</diff>
      <filename>src/osp_file.erl</filename>
    </modified>
    <modified>
      <diff>@@ -3,5 +3,220 @@
 %% @doc Manages all application servlets running on the node
 -module(osp_manager).
 
--export([]).
+% Application callbacks
+-export([startup/0, stop_node/0]).
 
+% Export the admin functions
+-export([shutdown_osp/0, stats/0, uptime/0, nodeapp/0, start_servlet/3, stop_servlet/2, bkup_db/2]).
+
+% Define the Mnesia record
+-record(osp_table, {key, val}).
+
+%% @doc Starts the local OSP node and all applications meant to be run on the node
+%% @spec startup() -&gt; {ok, pid(), pid()}
+startup() -&gt;
+    erl_boot_server:start(['127.0.0.1']),
+    DL = fun(IP) -&gt;
+		 erl_boot_server:add_slave(IP)
+	 end,
+    lists:foreach(DL, osp:get_conf('ALLOWED_DISKLESS')),
+    start_mnesia(),
+    case retrieve(uptime) of 
+	undefined -&gt;
+	    store(uptime, calendar:datetime_to_gregorian_seconds(erlang:universaltime()));
+	_ -&gt;
+	    ok
+    end,
+    case retrieve(nodeapp) of
+	undefined -&gt;
+	    store(nodeapp, []);
+	_ -&gt;
+	    ok
+    end,
+    F = fun({App, Port}) -&gt;
+		start_servlet(App, Port, node())
+	end,
+    lists:foreach(F, osp:get_conf('AUTO_STARTED')),
+    Pid = spawn(fun() -&gt; loop() end),
+    {ok, Pid, osp_web:start()}.
+
+%% @doc Stops all the applications on a given node
+stop_node() -&gt;
+    Apps = retrieve(nodeapp),
+    Node = node(),
+    {value, {Node, LocalApps}} = lists:keysearch(node(), 1, Apps),
+    F = fun({App, _}) -&gt;
+		osp_broker:stop(App)
+	end,
+    lists:foreach(F, LocalApps),
+    store(nodeapp, lists:keydelete(node(), 1, Apps)),
+    ok.
+
+%% @doc An endless loop to satisfy OTP's Pid requirement
+%% @spec loop() -&gt; none()
+loop() -&gt;
+    receive
+	_ -&gt;
+	    loop()
+    end.
+
+%% @doc The mnesia startup routine for osp_admin
+%% @spec start_mnesia() -&gt; ok
+start_mnesia() -&gt;
+    case lists:member(mnesia_sup, erlang:registered()) of
+	true -&gt;
+	    ok;
+	false -&gt;
+	    mnesia:start()
+    end,
+    case catch(mnesia:table_info(osp_table, all)) of
+	{'EXIT', _} -&gt;
+	    mnesia:create_table(osp_table, [{record_name, osp_table}, {disc_copies, [node()]}, {attributes, record_info(fields, osp_table)}]);
+	_ -&gt;
+	    ok
+    end,
+    ok.
+
+%% @doc Stores a value in the mnesia database
+%% @spec store(atom(), any()) -&gt; ok
+store(Key, Val) -&gt;
+    osp_mnesia:store(osp_table, Key, Val).
+
+%% @doc Gets a value from the mnesia database
+retrieve(Key) -&gt;
+    osp_mnesia:retrieve(osp_table, Key).
+
+%% @doc Returns the App-Node listing for the cluster
+%% @spec nodeapp() -&gt; list()
+nodeapp() -&gt;
+    retrieve(nodeapp).
+
+%% @todo This needs to update on every start of a new application
+%% @spec bkup_db(node(), atom()) -&gt; ok
+bkup_db(Node, Type) -&gt;
+    Tables = mnesia:system_info(tables),
+    F = fun(TableName) -&gt;
+		mnesia:add_table_copy(TableName, Node, Type),
+		rpc:call(Node, mnesia, wait_for_tables, [[TableName], 1000])
+	end,
+    lists:foreach(F, Tables),
+    ok.
+
+%% @doc Starts an appropriately typed table copy for a passed 
+%% @spec start_db(node(), atom()) -&gt; ok | error
+start_db(Node, App) -&gt;
+    TableName = erlang:list_to_atom(erlang:atom_to_list(App) ++ &quot;_table&quot;),
+    rpc:call(Node, mnesia, start, []),
+    case rpc:call(Node, init, get_argument, [loader]) of
+	error -&gt;
+	    rpc:call(Node, mnesia, change_config, [extra_db_nodes, [node()]]),
+	    rpc:call(Node, mnesia, change_table_copy_type, [schema, Node, disc_copies]),
+	    mnesia:add_table_copy(TableName, Node, disc_copies);
+	{ok, [[&quot;inet&quot;]]} -&gt;
+	    mnesia:add_table_copy(TableName, Node, ram_copies),
+	    rpc:call(Node, mnesia, change_config, [extra_db_nodes, [node()]]);
+	{ok, [[&quot;efile&quot;]]} -&gt;
+	    rpc:call(Node, mnesia, change_config, [extra_db_nodes, [node()]]),
+	    rpc:call(Node, mnesia, change_table_copy_type, [schema, Node, disc_copies]),
+	    mnesia:add_table_copy(TableName, Node, disc_copies)
+       end,
+    rpc:call(Node, mnesia, wait_for_tables, [[TableName], 1000]),
+    ok.
+
+%% @doc Returns a string of the allowed slave IPs
+%% @spec get_ok_slaves() -&gt; string()
+get_ok_slaves() -&gt;
+    Slaves = erl_boot_server:which_slaves(),
+    Fun = fun({NM, IP}, A) -&gt;
+		  A ++ &quot;\tIP: &quot; ++ ip_to_string(IP) ++ &quot; Netmask: &quot; ++ ip_to_string(NM) ++ &quot;\r\n&quot;
+	  end,
+    lists:foldl(Fun, [], Slaves).
+
+%% @doc Returns a human readable string from a tuple version of an IP address
+%% @spec ip_to_string(tuple()) -&gt; string()
+ip_to_string({A, B, C, D}) -&gt;
+    erlang:integer_to_list(A) ++ &quot;.&quot; ++ erlang:integer_to_list(B) ++ &quot;.&quot; ++ erlang:integer_to_list(C) ++ &quot;.&quot; ++ erlang:integer_to_list(D).
+
+%% @doc This returns a string of the OSP cluster statistics
+%% @spec stats() -&gt; string()
+stats() -&gt;
+    F = fun(Node, A) -&gt; A ++ io_lib:format(&quot;~p: ~.2f\r\n&quot;, [Node, round(100 * rpc:call(Node, cpu_sup, avg1, []) / 256) / 100]) end,
+    Out1 = &quot;Nodes in the cluster and their CPU Utilization: \r\n&quot;,
+    Out2 = lists:foldl(F, Out1, [node() | nodes()]),
+    Out2 ++ &quot;The following IPs are allowed to be diskless:\r\n&quot; ++ get_ok_slaves().
+
+%% @doc Attempts to find and stop an application on the cluster
+%% @spec stop_servlet(atom(), node()) -&gt; ok | error
+stop_servlet(App, Node) -&gt;
+    case lists:member(Node, [node() | nodes()]) of
+	true -&gt;
+	    if
+		Node =:= node() -&gt;
+		    osp_broker:stop(App);
+		true-&gt;
+		    rpc:call(Node, osp_broker, stop, [App])
+	    end,
+	    del_app_from_list(Node, App),
+	    ok;
+	false -&gt;
+	    error
+    end.
+
+%% @doc Starts a servlet application on a given node
+%% @spec start_servlet(atom(), int(), node()) -&gt; ok | error
+start_servlet(App, Port, Node) -&gt;
+    case lists:member(Node, [node() | nodes()]) of
+	true -&gt;
+	    if
+		Node =:= node() -&gt;
+		    osp_broker:start(App, Port);
+		true-&gt;
+		    start_db(Node, App),
+		    rpc:call(Node, osp_broker, start, [App, Port])
+	    end,
+	    add_app_to_list(Node, App, Port),
+	    ok;
+	false -&gt;
+	    error
+    end.
+
+%% @doc Returns a human readable string of the cluster uptime
+%% @spec uptime() -&gt; string()
+uptime() -&gt;
+    Seconds = retrieve(uptime),
+    NSeconds = calendar:datetime_to_gregorian_seconds(erlang:universaltime()),
+    {{_, _, Days}, {Hours, Mins, Secs}} = calendar:gregorian_seconds_to_datetime(NSeconds - Seconds),
+    erlang:integer_to_list(Days - 1) ++ &quot; days &quot; ++ erlang:integer_to_list(Hours) ++ &quot; hrs &quot; ++ erlang:integer_to_list(Mins) ++ &quot; mins &quot; ++ erlang:integer_to_list(Secs) ++ &quot; secs&quot;.
+
+%% @doc Shuts down the entire OSP cluster, and quits the Erlang VM
+%% @spec shutdown_osp() -&gt; ok
+shutdown_osp() -&gt;
+    F = fun(Node) -&gt;
+		rpc:call(Node, application, stop, [osp]),
+		rpc:call(Node, init, stop, [])
+	end,
+    lists:foreach(F, nodes()),
+    store(uptime, undefined),
+    store(nodeapp, []),
+    init:stop().
+
+%% @doc Deletes an application from the list of running applications
+%% @spec del_app_from_list(atom(), atom()) -&gt; ok
+del_app_from_list(Node, App) -&gt;
+    NodeApp = retrieve(nodeapp),
+    {Node, AppList} = lists:keyfind(Node, 1, NodeApp),
+    AL2 = lists:keydelete(App, 1, AppList),
+    store(nodeapp, lists:keyreplace(Node, 1, NodeApp, {Node, AL2})),
+    ok.
+
+%% @doc Adds an application to the list of running applications
+%% @spec add_app_to_list(atom(), atom(), integer()) -&gt; ok
+add_app_to_list(Node, App, Port) -&gt;
+    Nodeapp = retrieve(nodeapp),
+    case lists:keyfind(Node, 1, Nodeapp) of
+	false -&gt;
+	    store(nodeapp, [{Node, [{App, Port}]} | Nodeapp]);
+	{Node, AppList} -&gt;
+	    store(nodeapp, lists:keyreplace(Node, 1, Nodeapp, {Node, AppList ++ [{App, Port}]}))
+    end,
+    ok.</diff>
      <filename>src/osp_manager.erl</filename>
    </modified>
    <modified>
      <diff>@@ -49,15 +49,15 @@ clusterwide(Session, _Env, Input) -&gt;
     case Op of
 	&quot;shutdown&quot; -&gt;
 	    mod_esi:deliver(Session, &quot;OSP Shutdown&quot;),
-	    osp_admin:shutdown_osp();
+	    osp_manager:shutdown_osp();
 	&quot;stats&quot; -&gt;
-	    mod_esi:deliver(Session, nl2br(osp_admin:stats_osp()));
+	    mod_esi:deliver(Session, nl2br(osp_manager:stats()));
 	&quot;uptime&quot; -&gt;
-	    mod_esi:deliver(Session, osp_admin:uptime_osp());
+	    mod_esi:deliver(Session, osp_manager:uptime());
 	&quot;nodes&quot; -&gt;
 	    mod_esi:deliver(Session, erlang:integer_to_list(length([node() | nodes()])));
 	&quot;appnode&quot; -&gt;
-	    mod_esi:deliver(Session, io_lib:format(&quot;~p&quot;, [osp_admin:nodeapp()]));
+	    mod_esi:deliver(Session, io_lib:format(&quot;~p&quot;, [osp_manager:nodeapp()]));
 	_ -&gt;
 	    mod_esi:deliver(Session, &quot;&quot;)
     end.</diff>
      <filename>src/osp_web.erl</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>ce356252391d8cfd265e9e053177335834819b0e</id>
    </parent>
  </parents>
  <author>
    <name>Jacob Torrey</name>
    <email>torreyji@clarkson.edu</email>
  </author>
  <url>http://github.com/ranok/open-server-platform/commit/5aa50dcae6eeb54f1734557095e7e7c25d3cc2b3</url>
  <id>5aa50dcae6eeb54f1734557095e7e7c25d3cc2b3</id>
  <committed-date>2009-11-05T09:35:24-08:00</committed-date>
  <authored-date>2009-11-05T09:35:24-08:00</authored-date>
  <message>Refactored osp_admin into osp_admin and osp_manager. Modified the configuration to be a runtime configuration file.
Updated docs to reflect changes</message>
  <tree>55e3e8189a27314242ef7ac70000afff115e960c</tree>
  <committer>
    <name>Jacob Torrey</name>
    <email>torreyji@clarkson.edu</email>
  </committer>
</commit>
