Commit Diff


commit - 9e3ff41709ff61749c8fb60f90a28256f6051ee9
commit + 0c5b0816e0f53de20dcc2e73b291d557ded56219
blob - ed27bad78760b0292df6be226abb6944af0e869e
blob + 76570f037afcc664a5b74ceb158d40e96133a605
--- build.xml
+++ build.xml
@@ -218,6 +218,12 @@
     </copy>
   </target>
 
+  <target depends="compile-util" description="create api jar" name="jar-api">
+	  <jar destfile="${jar}/snipsnap-api.jar">
+		  <fileset dir="${target}/util/" includes="snipsnap/api/**"/>
+	  </jar>
+  </target>
+  
   <!-- create server code -->
   <target depends="compile-jsp, compile-server,installer-war,snipsnap-war" description="create server jar" name="jar-server">
     <copy file="conf/copyright.txt" tofile="${target}/server/conf/copyright.txt" filtering="true">
blob - 167d198469831a76b3f796c6420d3d06fbb71c03
blob + 5459ca4c450957b1021dfd2a2f8e738cda25f47c
Binary files lib/search-ng-1.0-alpha-1.jar and lib/search-ng-1.0-alpha-1.jar differ
blob - 82f9c2f94ade63bc3048b4160cfe83453e9bc99e
blob + 3783758778df24fec23cf41c9c836f9b677c1326
--- src/apps/default/WEB-INF/snipsnap.tld
+++ src/apps/default/WEB-INF/snipsnap.tld
@@ -36,7 +36,7 @@
     <tag-class>org.snipsnap.jsp.PathTag</tag-class>
     <attribute>
       <name>snip</name>
-      <type>org.snipsnap.snip.Snip</type>
+      <type>snipsnap.api.snip.Snip</type>
       <description>snip to get path for</description>
     </attribute>
    </tag>
@@ -46,7 +46,7 @@
     <tag-class>org.snipsnap.jsp.ContentTag</tag-class>
     <attribute>
       <name>snip</name>
-      <type>org.snipsnap.snip.Snip</type>
+      <type>snipsnap.api.snip.Snip</type>
       <description>snip to get content for</description>
     </attribute>
     <attribute>
@@ -68,7 +68,7 @@
     <tag-class>org.snipsnap.jsp.BackLinkTag</tag-class>
     <attribute>
       <name>snip</name>
-      <type>org.snipsnap.snip.Snip</type>
+      <type>snipsnap.api.snip.Snip</type>
       <description>snip to get backlinks for</description>
     </attribute>
     <attribute>
@@ -83,7 +83,7 @@
     <tag-class>org.snipsnap.jsp.SnipLinkTag</tag-class>
     <attribute>
       <name>snip</name>
-      <type>org.snipsnap.snip.Snip</type>
+      <type>snipsnap.api.snip.Snip</type>
       <description>snip to check roles against</description>
     </attribute>
     <attribute>
@@ -110,7 +110,7 @@
     </attribute>
     <attribute>
       <name>context</name>
-      <type>org.snipsnap.snip.Snip</type>
+      <type>snipsnap.api.snip.Snip</type>
       <description>snip to check roles against</description>
     </attribute>
     <attribute>
@@ -133,7 +133,7 @@
     </attribute>
     <attribute>
       <name>snip</name>
-      <type>org.snipsnap.snip.Snip</type>
+      <type>snipsnap.api.snip.Snip</type>
       <description>snip for output</description>
     </attribute>
   </tag>
blob - 7e1aaa445d7917188642b1a0ecfb7fb7b9d1fa71
blob + 2815604e6b92d03e0226467a1c1c91c26348c391
--- src/apps/default/admin/config/application.jsp
+++ src/apps/default/admin/config/application.jsp
@@ -1,4 +1,4 @@
-<%@ page import="org.snipsnap.config.Configuration"%>
+<%@ page import="snipsnap.api.config.Configuration"%>
  <%--
   ** Basic Settings of the Application
   ** @author Matthias L. Jugel
blob - 3d6832b1a8830a801dc82bfd7c905f6c11f2b7e3
blob + a48f947ec93740807ca4bdd3b009cc82255f490f
--- src/apps/default/admin/config/database.jsp
+++ src/apps/default/admin/config/database.jsp
@@ -1,5 +1,5 @@
 <%@ page import="java.util.*,
-                 org.snipsnap.config.Configuration"%>
+                 snipsnap.api.config.Configuration"%>
  <%--
   ** Database Settings
   ** @author Matthias L. Jugel
@@ -157,7 +157,7 @@
     <td><fmt:message key="config.app.database.file.text"/></td>
     <td>
       <input type="hidden" name="app.file.store"
-        value="<%= ((Configuration) pageContext.findAttribute("newconfig")).getGlobals().getProperty(Configuration.APP_FILE_STORE) %>">
+        value="<%= ((Configuration) pageContext.findAttribute("newconfig")).getGlobals().getProperty(snipsnap.api.config.Configuration.APP_FILE_STORE) %>">
       <fmt:message key="config.app.database.noconfig"/><br/>
     </td>
   </tr>
blob - b70ac62536641c232c849c313fa5f653439640b3
blob + fe3339928b9e97882560119a10962d806b686d57
--- src/apps/default/admin/config/expert.jsp
+++ src/apps/default/admin/config/expert.jsp
@@ -1,5 +1,5 @@
 <%@ page import="java.util.*,
-                 org.snipsnap.config.Configuration,
+                 snipsnap.api.config.Configuration,
                  java.text.SimpleDateFormat"%>
  <%--
   ** Expert Settings
blob - c0eefa6fa77e34024a78bc5436a367fa78f516d1
blob + 82b61d26a76e590e0cb9942d226dc1a0c8421ba7
--- src/apps/default/admin/config/finish.jsp
+++ src/apps/default/admin/config/finish.jsp
@@ -1,5 +1,5 @@
 <%@ page import="java.util.*,
-                 org.snipsnap.config.Configuration"%>
+                 snipsnap.api.config.Configuration"%>
  <%--
   ** The Finish
   ** @author Matthias L. Jugel
blob - 05884a6f7f02528f13deb5873196443609c10afa
blob + 2d621d767626e7aac5847018cd00c6d694106fea
--- src/apps/default/admin/config/localization.jsp
+++ src/apps/default/admin/config/localization.jsp
@@ -1,5 +1,5 @@
 <%@ page import="java.util.*,
-                 org.snipsnap.config.Configuration,
+                 snipsnap.api.config.Configuration,
                  java.text.SimpleDateFormat,
                  java.text.DateFormat"%>
  <%--
@@ -84,7 +84,7 @@
       <c:if test="${!empty errors['app.weblogDateFormat']}"><img src="images/attention.jpg"></c:if>
       <%
         Locale current = Locale.getDefault();
-        Configuration cfg = (Configuration)pageContext.findAttribute("newconfig");
+        snipsnap.api.config.Configuration cfg = (snipsnap.api.config.Configuration)pageContext.findAttribute("newconfig");
         Locale.setDefault(cfg.getLocale());
         try {
           DateFormat df = new SimpleDateFormat(cfg.getWeblogDateFormat());
blob - fcc45bac3e6ab9189586fc42f97b2bf1fd5511aa
blob + 794fe636d66da6756cedb0d60d3842f88fcfcc48
--- src/apps/default/admin/config/mail.jsp
+++ src/apps/default/admin/config/mail.jsp
@@ -1,5 +1,5 @@
 <%@ page import="java.util.*,
-                 org.snipsnap.config.Configuration"%>
+                 snipsnap.api.config.Configuration"%>
  <%--
   ** Mail Settings
   ** @author Matthias L. Jugel
blob - 8d78762a2ae04105b8058d0c674343e1a3c40a39
blob + c899b4666f8fe46525698f0987c5e98a311fbe27
--- src/apps/default/admin/config/moblog.jsp
+++ src/apps/default/admin/config/moblog.jsp
@@ -1,5 +1,5 @@
 <%@ page import="java.util.*,
-                 org.snipsnap.config.Configuration"%>
+                 snipsnap.api.config.Configuration"%>
  <%--
   ** Mobile Blogging Settings
   ** @author Matthias L. Jugel
blob - 65dac688b1f59240031e8362e9ee48c94d7b59a9
blob + 5fddfa402d8f513f40e6e444372d317dc23fa2c6
--- src/apps/default/admin/config/permissions.jsp
+++ src/apps/default/admin/config/permissions.jsp
@@ -1,5 +1,5 @@
 <%@ page import="java.util.*,
-                 org.snipsnap.config.Configuration"%>
+                 snipsnap.api.config.Configuration"%>
  <%--
   ** Permission settings
   ** @author Matthias L. Jugel
blob - 8355c61cacaf3a445d4e99af83a76f07cc0db5c3
blob + 2b794bfa4a65012e45f3b20e992ec39bcc2029fa
--- src/apps/default/admin/config/proxy.jsp
+++ src/apps/default/admin/config/proxy.jsp
@@ -1,5 +1,5 @@
 <%@ page import="java.util.*,
-                 org.snipsnap.config.Configuration"%>
+                 snipsnap.api.config.Configuration"%>
  <%--
   ** Proxy Settings
   ** @author Matthias L. Jugel
blob - 83e3d8d47628d5d5a10cf772a3bbb24e82eac002
blob + e90bf27d9f70eab2025f9c8d4e32ef7505bff175
--- src/apps/default/admin/config/theme.jsp
+++ src/apps/default/admin/config/theme.jsp
@@ -1,5 +1,5 @@
 <%@ page import="java.util.*,
-                 org.snipsnap.config.Configuration,
+                 snipsnap.api.config.Configuration,
                  java.io.File,
                  org.dom4j.Document,
                  org.dom4j.io.SAXReader,
@@ -8,9 +8,9 @@
                  org.dom4j.Element,
                  org.dom4j.Node,
                  java.io.FilenameFilter,
-                 org.snipsnap.snip.Snip,
+                 snipsnap.api.snip.Snip,
                  org.snipsnap.container.Components,
-                 org.snipsnap.snip.SnipSpace,
+                 snipsnap.api.snip.SnipSpace,
                  org.snipsnap.net.admin.ThemeHelper"%>
  <%--
   ** Theme selection.
@@ -24,14 +24,14 @@
 <fmt:setBundle basename="i18n.setup" scope="page" />
 
 <%
-  Configuration conf = (Configuration) session.getAttribute("newconfig");
+  snipsnap.api.config.Configuration conf = (Configuration) session.getAttribute("newconfig");
   Map themes = new HashMap();
   if (conf.isConfigured()) {
     Map installedThemes = ThemeHelper.getInstalledThemes();
     Iterator themeIt = installedThemes.keySet().iterator();
     while (themeIt.hasNext()) {
       String themeName = (String) themeIt.next();
-      themes.put(themeName, ((Snip)installedThemes.get(themeName)).getContent());
+      themes.put(themeName, ((snipsnap.api.snip.Snip)installedThemes.get(themeName)).getContent());
     }
   }
   request.setAttribute("themes", themes);
blob - 154d2b467557b0d86b688da22c6e21d8d7c3ac6f
blob + fc64180d096469cb32646f347d5dfa0ba8973c66
--- src/apps/default/admin/config/users.jsp
+++ src/apps/default/admin/config/users.jsp
@@ -1,6 +1,6 @@
 <%@ page import="java.util.*,
-                 org.snipsnap.config.Configuration,
-                 org.snipsnap.app.Application,
+                 snipsnap.api.config.Configuration,
+                 snipsnap.api.app.Application,
                  org.snipsnap.container.Components,
                  org.snipsnap.user.UserManager"%>
  <%--
blob - 691248533d70c5b7e7ce13b43ce359dc8edd3e51
blob + 198db45902ae21c0b54646bd105d4272c68a7e9f
--- src/apps/default/index.jsp
+++ src/apps/default/index.jsp
@@ -1,5 +1,5 @@
-<%@ page import="org.snipsnap.app.Application,
-                 org.snipsnap.config.Configuration"%>
+<%@ page import="snipsnap.api.app.Application,
+                 snipsnap.api.config.Configuration"%>
  <%--
   ** Template for redirection the root page to the start page
   ** @author Matthias L. Jugel
@@ -7,7 +7,7 @@
   --%>
 
 <%
-  Configuration snipConfig = Application.get().getConfiguration();
+  snipsnap.api.config.Configuration snipConfig = snipsnap.api.app.Application.get().getConfiguration();
   response.sendRedirect(snipConfig.getSnipUrl(snipConfig.getStartSnip()));
   return;
 %>
\ No newline at end of file
blob - 820f5ec40db6778fc1ef9c254851bf6e172d0d33
blob + 0f9bcc801cbb5defbb78597f56bca1974c9a04dc
--- src/apps/default/main.jsp
+++ src/apps/default/main.jsp
@@ -4,11 +4,11 @@
   ** @version $Id$
   --%>
 
-<%@ page import="org.snipsnap.snip.SnipSpace,
-                 org.snipsnap.app.Application,
-                 org.snipsnap.snip.SnipSpaceFactory,
+<%@ page import="snipsnap.api.snip.SnipSpace,
+                 snipsnap.api.app.Application,
+                 snipsnap.api.snip.SnipSpaceFactory,
                  org.snipsnap.container.Components,
-                 org.snipsnap.snip.Snip"%>
+                 snipsnap.api.snip.Snip"%>
 <%@ page pageEncoding="iso-8859-1" %>
 <% response.setContentType("text/html; charset="+Application.get().getConfiguration().getEncoding()); %>
 <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
@@ -58,7 +58,7 @@
    <%
      SnipSpace space = (SnipSpace)Components.getComponent(SnipSpace.class);
      for(int i = 1; space.exists("snipsnap-portlet-"+i) || space.exists("SnipSnap/portlet/"+i); i++) {
-       Snip snip = space.load("snipsnap-portlet-"+i);
+       snipsnap.api.snip.Snip snip = space.load("snipsnap-portlet-"+i);
        if(null == snip) {
          snip = space.load("SnipSnap/portlet/" + i);
        }
blob - a72957b7f2fc0359225d96ed07c1e7a850350c76
blob + 114c4c7209121d06ae74df04e8438693f051d68c
--- src/apps/default/rsd.jsp
+++ src/apps/default/rsd.jsp
@@ -1,6 +1,6 @@
 <%@ page pageEncoding="iso-8859-1" %><%--
 --%><%@ page contentType="text/xml; charset=UTF-8"%><%--
---%><%@ page import="org.snipsnap.snip.SnipSpace"%><%--
+--%><%@ page import="snipsnap.api.snip.SnipSpace"%><%--
 --%><?xml version="1.0" encoding="utf-8"?>
 <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %><%-- hack to remove linefeed
 --%><%@ taglib uri="http://snipsnap.com/snipsnap" prefix="s" %><%--
blob - 8e0703c1d4600db7d052aa25179aafd6064605da
blob + c8987f68f462eb4c1bb67028456ab4f6f343689e
--- src/apps/default/upload.jsp
+++ src/apps/default/upload.jsp
@@ -1,4 +1,4 @@
-<%@ page import="org.snipsnap.snip.Snip,
+<%@ page import="snipsnap.api.snip.Snip,
                  java.util.Collection,
                  java.util.Collections,
                  org.radeox.util.Encoder"%>
blob - 37230ef498031e748f4c1a7d7446cf268b37e9e4
blob + 8e1af7005af84fa47431207d9ca31adfcb32e93d
--- src/apps/default/version.jsp
+++ src/apps/default/version.jsp
@@ -1,8 +1,8 @@
 <%@ page pageEncoding="iso-8859-1" %><%--
 --%><%@ page contentType="text/xml; charset=UTF-8"%><%--
---%><%@ page import="org.snipsnap.snip.SnipSpace,
-                     org.snipsnap.snip.SnipSpaceFactory"%><%--
---%><% response.setHeader("ETag", SnipSpaceFactory.getInstance().getETag()); %><%--
+--%><%@ page import="snipsnap.api.snip.SnipSpace,
+                     snipsnap.api.snip.SnipSpaceFactory"%><%--
+--%><% response.setHeader("ETag", snipsnap.api.snip.SnipSpaceFactory.getInstance().getETag()); %><%--
 --%><?xml version="1.0" encoding="UTF-8"?>
 <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %><%-- hack to remove linefeed
 --%><%@ taglib uri="http://snipsnap.com/snipsnap" prefix="s" %><%--
blob - 806f02663a518eb1e1d6122095a8818f6e84865d
blob + d5e1589e811f64b5b1a6d351a2f1564c435e5568
--- src/apps/installer/install.jsp
+++ src/apps/installer/install.jsp
@@ -1,4 +1,4 @@
-<%@ page import="org.snipsnap.config.Configuration"%>
+<%@ page import="snipsnap.api.config.Configuration"%>
  <%--
   ** Initial installation ...
   ** @author Matthias L. Jugel
blob - aea13a57870f325a075b4c475b4cc7564503dc0f
blob + 1f7f619447d6612efb0f60537e05366024f7ec55
--- src/org/snipsnap/admin/AdminInitFilter.java
+++ src/org/snipsnap/admin/AdminInitFilter.java
@@ -25,7 +25,7 @@
 package org.snipsnap.admin;
 
 import org.apache.xmlrpc.XmlRpcException;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.config.ServerConfiguration;
 import org.snipsnap.net.filter.EncRequestWrapper;
 import org.snipsnap.server.AdminXmlRpcClient;
@@ -153,7 +153,7 @@ public class AdminInitFilter implements Filter {
           config.setProperty(Configuration.APP_HOST, host);
         }
         if (null != port && !"".equals(port)) {
-          config.setProperty(Configuration.APP_PORT, port);
+          config.setProperty(snipsnap.api.config.Configuration.APP_PORT, port);
         }
         if (null != contextPath && !"".equals(contextPath)) {
           config.setProperty(Configuration.APP_PATH, contextPath);
blob - 19e87626a86f4873910a6d20cde770612318b93d
blob + 42eb040fb3bac87d83941e97802809a9ae4d121a
--- src/org/snipsnap/app/PropertyFileApplicationStorage.java
+++ src/org/snipsnap/app/PropertyFileApplicationStorage.java
@@ -25,7 +25,7 @@
  */
 package org.snipsnap.app;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.config.Globals;
 import org.snipsnap.jdbc.UIDGenerator;
 import org.radeox.util.logging.Logger;
@@ -40,6 +40,9 @@ import java.util.Properties;
 import java.util.HashMap;
 import java.util.Iterator;
 
+import snipsnap.api.app.*;
+import snipsnap.api.app.Application;
+
 public class PropertyFileApplicationStorage implements ApplicationStorage {
   private final static String PREFIX_FILE = "prefix.properties";
 
@@ -48,7 +51,7 @@ public class PropertyFileApplicationStorage implements
 
   public PropertyFileApplicationStorage() {
     applications = new HashMap();
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     File fileStore = new File(config.getGlobal(Globals.APP_FILE_STORE));
     File[] instances = fileStore.listFiles(new FileFilter() {
       public boolean accept(File file) {
blob - 46fd928bd77d33097fbe946fa6df13e0b4b609a0
blob + 6cc22556040f8905f0221dafcd67b302fbd00045
--- src/org/snipsnap/config/ConfigurationManager.java
+++ src/org/snipsnap/config/ConfigurationManager.java
@@ -27,7 +27,9 @@ package org.snipsnap.config;
 import org.snipsnap.notification.Consumer;
 import org.snipsnap.notification.Message;
 import org.snipsnap.notification.MessageService;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.config.*;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
 import org.radeox.util.logging.Logger;
 
@@ -62,7 +64,7 @@ public class ConfigurationManager implements Consumer 
     prefixMap = new HashMap();
   }
 
-  public Configuration addConfiguration(String oid, Configuration config) {
+  public snipsnap.api.config.Configuration addConfiguration(String oid, Configuration config) {
     if(config.isInstalled()) {
       MessageService service = (MessageService)Components.getComponent(MessageService.class);
       service.register(this);
@@ -94,7 +96,7 @@ public class ConfigurationManager implements Consumer 
 
   public void consume(Message messsage) {
     if(Message.SNIP_MODIFIED.equals(messsage.getType())) {
-      Snip snip = (Snip)messsage.getValue();
+      Snip snip = (snipsnap.api.snip.Snip)messsage.getValue();
       if("SnipSnap/config".equals(snip.getName())) {
         String appOid = snip.getApplication();
         Configuration config = getConfiguration(appOid);
blob - 2fd18cb308dd0462ada38ae9db65f290482de018
blob + fe1c123c35e1623b29f7812bc9b553437652a99f
--- src/org/snipsnap/config/ConfigurationMap.java
+++ src/org/snipsnap/config/ConfigurationMap.java
@@ -24,7 +24,9 @@
  */
 package org.snipsnap.config;
 
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.*;
+import snipsnap.api.config.Configuration;
 
 import java.io.File;
 import java.io.IOException;
@@ -120,7 +122,7 @@ public class ConfigurationMap {
   }
 
   public String getFileStore() {
-    return getFileStore((String)Application.get().getObject(Application.OID)).getPath();
+    return getFileStore((String)snipsnap.api.app.Application.get().getObject(snipsnap.api.app.Application.OID)).getPath();
   }
 
   public File getFileStore(String applicationOid) {
@@ -139,7 +141,7 @@ public class ConfigurationMap {
    * Initialize new configuration map
    * @param init
    */
-  public ConfigurationMap(Configuration init) {
+  public ConfigurationMap(snipsnap.api.config.Configuration init) {
     initDefaults();
     webInfDir = init.getWebInfDir();
     initialize((Properties) init.getProperties().clone());
@@ -320,7 +322,7 @@ public class ConfigurationMap {
   }
 
   public File getFilePath() {
-    return getFilePath((String) Application.get().getObject(Application.OID));
+    return getFilePath((String) snipsnap.api.app.Application.get().getObject(Application.OID));
   }
 
   public File getIndexPath() {
@@ -355,7 +357,7 @@ public class ConfigurationMap {
    * Return base url to Snipsnap instance
    */
   public String getUrl() {
-    URL url = (URL)Application.get().getObject(Application.URL);
+    URL url = (URL)Application.get().getObject(snipsnap.api.app.Application.URL);
     if(null != url) {
       return url.toExternalForm();
     }
blob - 7f157e76ee49b47c55ddcd67c42c065b8e9b0031
blob + 8b15f74b9dd08e71d2377628c5464bf22def72a0
--- src/org/snipsnap/config/ConfigurationProxy.java
+++ src/org/snipsnap/config/ConfigurationProxy.java
@@ -24,6 +24,9 @@
  */
 package org.snipsnap.config;
 
+import snipsnap.api.config.*;
+import snipsnap.api.config.Configuration;
+
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
@@ -179,7 +182,7 @@ public class ConfigurationProxy implements InvocationH
   // PROXY FACTORY HANDLING
   public static Configuration proxy = null;
 
-  public static Configuration getInstance() {
+  public static snipsnap.api.config.Configuration getInstance() {
     if (proxy == null) {
       newInstance();
     }
blob - 9c40fe04dfe8d026975134bb12a12aaa89e08d35
blob + 66c953d4a351d51f8bf34f3fefcd513c4a7e61bc
--- src/org/snipsnap/config/InitializeDatabase.java
+++ src/org/snipsnap/config/InitializeDatabase.java
@@ -24,18 +24,20 @@
  */
 package org.snipsnap.config;
 
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.app.ApplicationManager;
 import org.snipsnap.app.ApplicationStorage;
 import org.snipsnap.container.Components;
 import org.snipsnap.snip.HomePage;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 import org.snipsnap.snip.XMLSnipImport;
 import org.snipsnap.snip.label.RenderEngineLabel;
 import org.snipsnap.user.Permissions;
 import org.snipsnap.user.Roles;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
+import snipsnap.api.config.*;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.user.UserManager;
 import org.snipsnap.user.UserManagerFactory;
 import org.snipsnap.net.admin.ThemeHelper;
@@ -57,7 +59,7 @@ public class InitializeDatabase {
   private static void message(String message) {
     if (null != output.get()) {
       PrintWriter writer = (PrintWriter) output.get();
-      writer.println("[" + Application.get().getConfiguration().getName() + "] " + message);
+      writer.println("[" + snipsnap.api.app.Application.get().getConfiguration().getName() + "] " + message);
       writer.flush();
     }
   }
@@ -79,14 +81,14 @@ public class InitializeDatabase {
     String appOid = prefixProps.getProperty(ApplicationStorage.OID);
     try {
       message("created application oid: " + appOid);
-      app.storeObject(Application.OID, appOid);
+      app.storeObject(snipsnap.api.app.Application.OID, appOid);
 
       new File(config.getFileStore()).mkdirs();
       // automatically created by the indexer
       // (new File(config.getIndexPath())).mkdirs();
 
       // get an instance of the snip space
-      SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
+      SnipSpace space = (snipsnap.api.snip.SnipSpace) Components.getComponent(SnipSpace.class);
 
       createAdministrator(config);
 
@@ -117,7 +119,7 @@ public class InitializeDatabase {
 
       postFirstBlog(config, space);
 
-      config.set(Configuration.APP_PERM_WEBLOGSPING, ping);
+      config.set(snipsnap.api.config.Configuration.APP_PERM_WEBLOGSPING, ping);
       config.set(Configuration.APP_PERM_NOTIFICATION, notify);
 
       ConfigurationManager configManager = ConfigurationManager.getInstance();
@@ -136,12 +138,12 @@ public class InitializeDatabase {
     return appOid;
   }
 
-  public static void createConfigSnipFromFile(String name, String file, SnipSpace space) throws IOException {
+  public static void createConfigSnipFromFile(String name, String file, snipsnap.api.snip.SnipSpace space) throws IOException {
     String content = getResourceAsString(InitializeDatabase.class.getResourceAsStream(file));
     createConfigSnip(name, content, space);
   }
 
-  public static Snip createConfigSnip(String name, String content, SnipSpace space) {
+  public static snipsnap.api.snip.Snip createConfigSnip(String name, String content, snipsnap.api.snip.SnipSpace space) {
     Snip snip = space.create(name, content);
     snip.getPermissions().add(Permissions.EDIT_SNIP, Roles.ADMIN);
     snip.getPermissions().add(Permissions.ATTACH_TO_SNIP, Roles.ADMIN);
@@ -150,7 +152,7 @@ public class InitializeDatabase {
     return snip;
   }
 
-  private static void postFirstBlog(Configuration config, SnipSpace space) throws IOException {
+  private static void postFirstBlog(Configuration config, snipsnap.api.snip.SnipSpace space) throws IOException {
     message("posting initial weblog entry");
     String weblogPost = getResourceAsString(getLocalizedResource("i18n.welcome", "blog", config.getLocale()));
     String title = weblogPost.substring(0, weblogPost.indexOf('\n'));
@@ -161,7 +163,7 @@ public class InitializeDatabase {
   public final static String LOGO_FILE = "_logofile";
   public final static String LOGO_FILE_TYPE = "_logofiletype";
 
-  private static void storeConfiguration(Configuration config, SnipSpace space) throws IOException {
+  private static void storeConfiguration(Configuration config, snipsnap.api.snip.SnipSpace space) throws IOException {
     String logoFileName = config.get(LOGO_FILE);
     String logoFileType = config.get(LOGO_FILE_TYPE);
     config.getProperties().remove(LOGO_FILE);
@@ -195,7 +197,7 @@ public class InitializeDatabase {
     }
   }
 
-  private static User createAdministrator(Configuration config) {
+  private static snipsnap.api.user.User createAdministrator(Configuration config) {
     // create admin account
     message("creating administrator account and snip");
     UserManager um = UserManagerFactory.getInstance();
@@ -213,7 +215,7 @@ public class InitializeDatabase {
     config.setAdminPassword(admin.getPasswd());
 
     // set current user and create it's homepage
-    Application.get().setUser(admin);
+    snipsnap.api.app.Application.get().setUser(admin);
     HomePage.create(config.getAdminLogin());
 
     return admin;
blob - dfaec4a4a4dfd26f59bd11a07cadf4a6a88df583
blob + ba49b47a3801f32259b868d3c0ba6ea0c217e3a8
--- src/org/snipsnap/container/DefaultSessionService.java
+++ src/org/snipsnap/container/DefaultSessionService.java
@@ -26,14 +26,14 @@
 package org.snipsnap.container;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 import org.snipsnap.snip.storage.UserStorage;
 import org.snipsnap.user.AuthenticationService;
 import org.snipsnap.user.Digest;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
@@ -64,7 +64,7 @@ public class DefaultSessionService implements SessionS
     this.authService = authService;
 
     try {
-      Snip robots = space.load(Configuration.SNIPSNAP_CONFIG_ROBOTS);
+      snipsnap.api.snip.Snip robots = space.load(snipsnap.api.config.Configuration.SNIPSNAP_CONFIG_ROBOTS);
       if (robots != null) {
         BufferedReader crawler = new BufferedReader(new StringReader(robots.getContent()));
         String line = null;
@@ -205,7 +205,7 @@ public class DefaultSessionService implements SessionS
 
   private String getCookiePath() {
     String path;
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     try {
       path = new URL(config.getUrl()).getPath();
       if (path == null || path.length() == 0) {
blob - e44ed0f5f006188e234a995bc752ab41de9f29d0
blob + 1c6a2c586a7bbd7d211ba4ab9476506d21388ecc
--- src/org/snipsnap/container/PicoContainer.java
+++ src/org/snipsnap/container/PicoContainer.java
@@ -8,7 +8,7 @@ import java.util.Iterator;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpace;
 import org.snipsnap.snip.SnipSpaceImpl;
 import org.snipsnap.snip.label.LabelManager;
 import org.snipsnap.snip.attachment.storage.AttachmentStorage;
@@ -111,7 +111,7 @@ public class PicoContainer implements Container {
         addComponent(ApplicationManager.class);
         addComponent(LabelManager.class);
 
-        addComponent(JmDnsService.class);
+        //addComponent(JmDnsService.class);
         // Feeders
         addComponent(FeederRepository.class, BasicFeederRepository.class);
 
@@ -144,7 +144,7 @@ public class PicoContainer implements Container {
         Iterator iterator = components.iterator();
         while (iterator.hasNext()) {
             Object o = iterator.next();
-            if (o.getClass().equals(c)) {
+            if (c.isAssignableFrom(o.getClass())) {
                 result.add(o);
             }
 
blob - add424c9dbff253a3717a5c7688dfc0580ab6e57
blob + 17d07a6e727be1d51d1e233e3d6c51a5814f0e5b
--- src/org/snipsnap/container/SessionService.java
+++ src/org/snipsnap/container/SessionService.java
@@ -1,6 +1,6 @@
 package org.snipsnap.container;
 
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
blob - 5853b56af272ba497a9ae5dcb90dd5bf31e35532
blob + 67c67754c43bf6eed74b761bad49865b8d72ab9d
--- src/org/snipsnap/date/Month.java
+++ src/org/snipsnap/date/Month.java
@@ -25,11 +25,11 @@
 package org.snipsnap.date;
 
 import org.radeox.util.i18n.ResourceManager;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpaceFactory;
 
 import java.text.DateFormatSymbols;
 import java.util.Calendar;
@@ -104,7 +104,7 @@ public class Month {
     Set days = new HashSet();
 
     while (iterator.hasNext()) {
-      Snip snip = (Snip) iterator.next();
+      snipsnap.api.snip.Snip snip = (Snip) iterator.next();
       days.add(snip.getName());
     }
     return days;
@@ -132,8 +132,8 @@ public class Month {
     }
 
     Application app = Application.get();
-    Configuration config = app.getConfiguration();
-    Snip viewedSnip = (Snip) app.getParameters().get("viewed");
+    snipsnap.api.config.Configuration config = app.getConfiguration();
+    Snip viewedSnip = (snipsnap.api.snip.Snip) app.getParameters().get("viewed");
     String weblogName = (String) app.getParameters().get("weblog");
     String viewed = viewedSnip != null ? viewedSnip.getName() : config.getStartSnip();
     if (weblogName == null) {
@@ -150,10 +150,10 @@ public class Month {
 
     if (navigation) {
       view.append("<a href=\"");
-      view.append(SnipLink.getSpaceRoot()).append("/");
+      view.append(snipsnap.api.snip.SnipLink.getSpaceRoot()).append("/");
       view.append(viewed);
       view.append("?calsnip=");
-      view.append(SnipLink.encode(viewed));
+      view.append(snipsnap.api.snip.SnipLink.encode(viewed));
       view.append("&amp;calmonth=");
       view.append(prevMonth);
       view.append("&amp;calyear=");
@@ -166,10 +166,10 @@ public class Month {
     view.append(" ");
     if (navigation) {
       view.append("<a href=\"");
-      view.append(SnipLink.getSpaceRoot()).append("/");
+      view.append(snipsnap.api.snip.SnipLink.getSpaceRoot()).append("/");
       view.append(viewed);
       view.append("?calsnip=");
-      view.append(SnipLink.encode(viewed));
+      view.append(snipsnap.api.snip.SnipLink.encode(viewed));
       view.append("&amp;calmonth=");
       view.append(nextMonth);
       view.append("&amp;calyear=");
@@ -178,7 +178,7 @@ public class Month {
     }
     if (viewedSnip != null && !weblogName.equals(config.getStartSnip())) {
       view.append(" (");
-      Snip weblogSnip = SnipSpaceFactory.getInstance().load(weblogName);
+      snipsnap.api.snip.Snip weblogSnip = snipsnap.api.snip.SnipSpaceFactory.getInstance().load(weblogName);
       view.append(weblogSnip.getLink());
       view.append(")");
     }
@@ -227,9 +227,9 @@ public class Month {
       String calBlogNew = weblogName + "/" + calBlogOld + "/1";
 
       if (days.contains(calBlogNew)) {
-        day = makeLink(SnipLink.encode(calBlogNew) + "?calsnip=" + SnipLink.encode(viewed) + "&amp;calmonth=" + month + "&amp;calyear=" + year, day);
+        day = makeLink(snipsnap.api.snip.SnipLink.encode(calBlogNew) + "?calsnip=" + snipsnap.api.snip.SnipLink.encode(viewed) + "&amp;calmonth=" + month + "&amp;calyear=" + year, day);
       } else if (days.contains(calBlogOld)) {
-        day = makeLink(SnipLink.encode(calBlogOld) + "?calsnip=" + SnipLink.encode(viewed) + "&amp;calmonth=" + month + "&amp;calyear=" + year, day);
+        day = makeLink(snipsnap.api.snip.SnipLink.encode(calBlogOld) + "?calsnip=" + snipsnap.api.snip.SnipLink.encode(viewed) + "&amp;calmonth=" + month + "&amp;calyear=" + year, day);
       }
 
       if (i == todayNumber && month == today.get(Calendar.MONTH) + 1 && year == today.get(Calendar.YEAR)) {
@@ -271,6 +271,6 @@ public class Month {
 
   private String makeLink(String snipName, String view) {
     StringBuffer linkBuffer = new StringBuffer();
-    return SnipLink.appendLinkWithRoot(linkBuffer, SnipLink.getSpaceRoot(), snipName, view).toString();
+    return snipsnap.api.snip.SnipLink.appendLinkWithRoot(linkBuffer, snipsnap.api.snip.SnipLink.getSpaceRoot(), snipName, view).toString();
   }
 }
blob - 54ffb9ee08dcbf15dc661b861d56b03271f28a8e
blob + dc0e630fb69afd6d00f22a732ea3d38c652e1c99
--- src/org/snipsnap/graph/NameSpaceTreeBuilder.java
+++ src/org/snipsnap/graph/NameSpaceTreeBuilder.java
@@ -28,8 +28,8 @@ import org.snipsnap.container.Components;
 import org.snipsnap.graph.builder.TreeBuilder;
 import org.snipsnap.graph.graph.Tree;
 import org.snipsnap.graph.graph.TreeNode;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 
 public class NameSpaceTreeBuilder implements TreeBuilder {
   private String root;
@@ -39,9 +39,9 @@ public class NameSpaceTreeBuilder implements TreeBuild
   }
 
   public Tree build() {
-    SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
+    SnipSpace space = (snipsnap.api.snip.SnipSpace) Components.getComponent(SnipSpace.class);
 
-    Snip[] snips = space.match(root);
+    snipsnap.api.snip.Snip[] snips = space.match(root);
 
     if (root.endsWith("/")) {
       root = root.substring(0, root.length() - 1);
blob - 67d101d0fc37987b306c5c852913e29763ed3d6b
blob + 66f3e4495117aa187a92f33c9e5e22a7d0c815cc
--- src/org/snipsnap/interceptor/custom/ACLInterceptor.java
+++ src/org/snipsnap/interceptor/custom/ACLInterceptor.java
@@ -25,11 +25,11 @@
 
 package org.snipsnap.interceptor.custom;
 
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.user.Roles;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 import org.snipsnap.security.AccessController;
 import org.snipsnap.container.Components;
 
@@ -61,7 +61,7 @@ public class ACLInterceptor implements Interceptor {
     // hack should a.) also check other methods b.) declare security for every method
     String name = invocation.getMethod().getName();
     User user = Application.get().getUser();
-    Snip snip = (Snip) invocation.getProxy().getProxyContext().unwrap();
+    Snip snip = (snipsnap.api.snip.Snip) invocation.getProxy().getProxyContext().unwrap();
     if (invocation.getMethod().getName().startsWith("set")) {
        // if (controller.checkPermission(user, new Permission("CHANGE_SNIP"), new OwnerAccessContext(snip))) {
       //Logger.debug("ACLInterceptor: Method="+invocation.getMethod().getName());
blob - ec4d445f905bc7246c0db7efd4ba742032eb9a2c
blob + 041723a52145a33e1f278cb9c224beac3d0baf71
--- src/org/snipsnap/interceptor/custom/BlogACLInterceptor.java
+++ src/org/snipsnap/interceptor/custom/BlogACLInterceptor.java
@@ -25,9 +25,9 @@
 
 package org.snipsnap.interceptor.custom;
 
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 import org.snipsnap.container.Components;
 import org.snipsnap.security.AccessController;
 
@@ -47,7 +47,7 @@ public class BlogACLInterceptor implements Interceptor
 
   public Object intercept(Invocation invocation) throws Throwable {
     if (invocation.getMethod().getName().startsWith("post")) {
-      User user = Application.get().getUser();
+      snipsnap.api.user.User user = Application.get().getUser();
       if (! access.checkPermission(user, new Permission("POST_BLOG"), new OwnerAccessContext(null))) {
         throw new GeneralSecurityException("Not allowed to post.");
       }
blob - 218a3918c3f458e9cb6c3cded948ccc9dc0e2ff1
blob + 91f226978ca08e41f2bd9a6ab3cc0abb87cb4445
--- src/org/snipsnap/interceptor/custom/MissingInterceptor.java
+++ src/org/snipsnap/interceptor/custom/MissingInterceptor.java
@@ -26,7 +26,7 @@
 package org.snipsnap.interceptor.custom;
 
 import dynaop.DispatchInterceptor;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.util.ApplicationAwareMap;
 
 import java.util.HashMap;
@@ -75,7 +75,7 @@ public class MissingInterceptor extends DispatchInterc
       return result.booleanValue();
   }
 
-  public Snip create(String name, String content) throws Throwable {
+  public snipsnap.api.snip.Snip create(String name, String content) throws Throwable {
     Object result = proceed();
 
     if (missing.getMap().containsKey(name)) {
@@ -84,7 +84,7 @@ public class MissingInterceptor extends DispatchInterc
     return (Snip) result;
   }
 
-  public void remove(Snip snip) throws Throwable {
+  public void remove(snipsnap.api.snip.Snip snip) throws Throwable {
     String name = snip.getName().toUpperCase();
 
     Object result = proceed();
blob - f11decba43f25bcc5d11b06c99c970c0b2bb25e7
blob + 5337da7ba1ebd73accafc8a723f6ecd033ce0c6c
--- src/org/snipsnap/interceptor/custom/SnipSpaceACLInterceptor.java
+++ src/org/snipsnap/interceptor/custom/SnipSpaceACLInterceptor.java
@@ -27,11 +27,11 @@ package org.snipsnap.interceptor.custom;
 
 import dynaop.DispatchInterceptor;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.user.Roles;
 import org.snipsnap.user.Security;
-import org.snipsnap.user.User;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.user.User;
+import snipsnap.api.snip.Snip;
 
 import java.security.GeneralSecurityException;
 
@@ -45,8 +45,8 @@ public class SnipSpaceACLInterceptor extends DispatchI
     roles.add("Admin");
   }
 
-  public void remove(Snip snip) throws Throwable {
-    User user = Application.get().getUser();
+  public void remove(snipsnap.api.snip.Snip snip) throws Throwable {
+    snipsnap.api.user.User user = snipsnap.api.app.Application.get().getUser();
     if (!Security.hasRoles(user, null, roles)) {
       Logger.debug("SECURITY EXCEPTION");
       throw new GeneralSecurityException("Not allowed to remove.");
blob - 855d49ee8cd942d489988b2ed82e61e4e39a4a7a
blob + 3d3ac47fbb1a4a752151d2dac93291b5c98b4db9
--- src/org/snipsnap/interceptor/custom/StoreInterceptor.java
+++ src/org/snipsnap/interceptor/custom/StoreInterceptor.java
@@ -26,7 +26,7 @@
 package org.snipsnap.interceptor.custom;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import dynaop.Interceptor;
 import dynaop.Invocation;
 
@@ -37,7 +37,7 @@ public class StoreInterceptor implements Interceptor {
 
   public Object intercept(Invocation invocation) throws Throwable {
     if (invocation.getMethod().getName().startsWith("store")) {
-      Snip snip = (Snip) invocation.getArguments()[0];
+      Snip snip = (snipsnap.api.snip.Snip) invocation.getArguments()[0];
       if (snip.getName().startsWith("macro-")) {
         Logger.debug("Store on macro called.");
       }
blob - 0221705a69cfbc722b7dc6ca58782b5a7ff40cce
blob + 9b8ba78f3b03582e4130313557d2c62a8acf88f7
--- src/org/snipsnap/jsp/BackLinkTag.java
+++ src/org/snipsnap/jsp/BackLinkTag.java
@@ -27,7 +27,7 @@ package org.snipsnap.jsp;
 import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
 import org.radeox.util.logging.Logger;
 import org.snipsnap.render.filter.links.BackLinks;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.JspWriter;
@@ -35,7 +35,7 @@ import javax.servlet.jsp.tagext.BodyTag;
 import javax.servlet.jsp.tagext.TagSupport;
 
 public class BackLinkTag extends TagSupport {
-  Snip snip = null;
+  snipsnap.api.snip.Snip snip = null;
   int count = 15;
 
   public int doStartTag() throws JspException {
blob - a8274f2c4f1387f30aed6cd9c2638db6e94c53a5
blob + bf78a919bdbc01ab6f1271d0c53db5e955133a3d
--- src/org/snipsnap/jsp/ContentTag.java
+++ src/org/snipsnap/jsp/ContentTag.java
@@ -28,7 +28,7 @@ import org.apache.taglibs.standard.lang.support.Expres
 import org.radeox.filter.Filter;
 import org.radeox.filter.HtmlRemoveFilter;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.dom4j.io.XMLWriter;
 import org.dom4j.io.OutputFormat;
 
@@ -48,7 +48,7 @@ import java.io.StringWriter;
  */
 
 public class ContentTag extends TagSupport {
-  Snip snip = null;
+  snipsnap.api.snip.Snip snip = null;
   boolean extract = false;
   boolean removeHtml = false;
   boolean encodeHtml = false;
blob - 0e7f410d51586f1f4425ff30a728eef6e34a5546
blob + 85d1e9fed0e723f5e30de72bd4a2bd0c4daaef7e
--- src/org/snipsnap/jsp/CoordinatesTag.java
+++ src/org/snipsnap/jsp/CoordinatesTag.java
@@ -25,8 +25,8 @@
 package org.snipsnap.jsp;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.app.Application;
+import snipsnap.api.snip.Snip;
 
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.JspWriter;
@@ -34,7 +34,7 @@ import javax.servlet.jsp.tagext.TagSupport;
 import java.io.IOException;
 
 public class CoordinatesTag extends TagSupport {
-  Snip snip = null;
+  snipsnap.api.snip.Snip snip = null;
 
   public int doStartTag() throws JspException {
     try {
blob - 75fc7d404cf4b3910961f7b4d6bc16ccfb17b139
blob + 20f2c255ac1596effd4c4ecdc183f213aeb6ebd2
--- src/org/snipsnap/jsp/DebugTag.java
+++ src/org/snipsnap/jsp/DebugTag.java
@@ -25,8 +25,8 @@
 package org.snipsnap.jsp;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.app.Application;
+import snipsnap.api.snip.Snip;
 
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.JspWriter;
@@ -40,7 +40,7 @@ public class DebugTag extends TagSupport {
 
   public int doStartTag() throws JspException {
     JspWriter out = pageContext.getOut();
-    Application app = Application.get();
+    snipsnap.api.app.Application app = snipsnap.api.app.Application.get();
     List debug = app.getLog();
     app.clearLog();
     if (!debug.isEmpty()) {
blob - b97d36691384b81f159321f8d75b7e795010cc08
blob + c7343a481dba820f4679884dd28a933438420226
--- src/org/snipsnap/jsp/ImageTag.java
+++ src/org/snipsnap/jsp/ImageTag.java
@@ -26,7 +26,7 @@ package org.snipsnap.jsp;
 
 import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.snip.SnipLink;
 
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.JspWriter;
blob - 14be175f0e0ba79baf0a8737f01328f11a0f5a79
blob + 358bb90188a52c935929a493965a7c132becf945
--- src/org/snipsnap/jsp/NewCheckPermission.java
+++ src/org/snipsnap/jsp/NewCheckPermission.java
@@ -27,12 +27,12 @@ package org.snipsnap.jsp;
 import gabriel.Permission;
 import gabriel.components.context.OwnerAccessContext;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
 import org.snipsnap.security.AccessController;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpaceFactory;
-import org.snipsnap.user.User;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpaceFactory;
+import snipsnap.api.user.User;
 import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
 
 import javax.servlet.jsp.JspException;
@@ -40,7 +40,7 @@ import javax.servlet.jsp.JspTagException;
 import javax.servlet.jsp.jstl.core.ConditionalTagSupport;
 
 public class NewCheckPermission extends ConditionalTagSupport {
-  protected Snip snip;
+  protected snipsnap.api.snip.Snip snip;
   protected Permission permission;
   protected boolean invertCheck = false;
 
@@ -52,7 +52,7 @@ public class NewCheckPermission extends ConditionalTag
   public void setName(String snip) {
     try {
       String snipName = (String) ExpressionEvaluatorManager.evaluate("snip", snip, String.class, this, pageContext);
-      this.snip = SnipSpaceFactory.getInstance().load(snipName);
+      this.snip = snipsnap.api.snip.SnipSpaceFactory.getInstance().load(snipName);
     } catch (JspException e) {
       Logger.warn("unable to evaluate expression", e);
     }
@@ -83,7 +83,7 @@ public class NewCheckPermission extends ConditionalTag
   protected boolean condition() throws JspTagException {
     AccessController controller = (AccessController) Components.getComponent(AccessController.class);
 
-    Application app = Application.get();
+    Application app = snipsnap.api.app.Application.get();
     User user = app.getUser();
     boolean isTrue = false;
     isTrue = controller.checkPermission(user, permission, new OwnerAccessContext(snip));
blob - 2f4fe944d1b824afbe6c7c439c9e4a29c86e0ff1
blob + 664dc4b67a4c4dba8e07b915fab7e740555bfa09
--- src/org/snipsnap/jsp/PathTag.java
+++ src/org/snipsnap/jsp/PathTag.java
@@ -26,8 +26,8 @@ package org.snipsnap.jsp;
 
 import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpaceFactory;
 
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.JspWriter;
@@ -49,7 +49,7 @@ public class PathTag extends TagSupport {
     if (null != snip) {
        try {
         JspWriter out = pageContext.getOut();
-        snip.getPath().append(out, SnipSpaceFactory.getInstance());
+        snip.getPath().append(out, snipsnap.api.snip.SnipSpaceFactory.getInstance());
       } catch (IOException e) {
         Logger.warn("doStartTag in PathTag", e);
       }
blob - f01fa75719a39f51aac18031e3a8e588cc8fb739
blob + fa0aa8a8a65fac2cf6a3c707456142ee85e68087
--- src/org/snipsnap/jsp/SnipLinkTag.java
+++ src/org/snipsnap/jsp/SnipLinkTag.java
@@ -28,7 +28,7 @@ import org.apache.taglibs.standard.lang.support.Expres
 import org.radeox.util.logging.Logger;
 import org.snipsnap.render.filter.links.SnipLinks;
 import org.snipsnap.snip.Links;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.JspWriter;
blob - c8c12ca6ee3d50f30f5ec4d621dfec4f1a242f47
blob + bf11513080bfbc5ea6263f8d17c6f8d1e614c16c
--- src/org/snipsnap/jsp/SnipTag.java
+++ src/org/snipsnap/jsp/SnipTag.java
@@ -26,8 +26,8 @@ package org.snipsnap.jsp;
 
 import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpaceFactory;
 
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.tagext.TagSupport;
@@ -58,8 +58,8 @@ public class SnipTag extends TagSupport {
   public void setName(String name) {
     try {
       String snipName = (String) ExpressionEvaluatorManager.evaluate("name", name, String.class, this, pageContext);
-      if (SnipSpaceFactory.getInstance().exists(snipName)) {
-        snip = SnipSpaceFactory.getInstance().load(snipName);
+      if (snipsnap.api.snip.SnipSpaceFactory.getInstance().exists(snipName)) {
+        snip = snipsnap.api.snip.SnipSpaceFactory.getInstance().load(snipName);
       }
     } catch (JspException e) {
       Logger.warn("unable to evaluate expression", e);
blob - 35d9fa7f3defd5042a6432342002ba29647aae53
blob + febe6f6ecb720cc2e7d15770c34ed75e53a252b4
--- src/org/snipsnap/net/AddLabelServlet.java
+++ src/org/snipsnap/net/AddLabelServlet.java
@@ -25,12 +25,12 @@
 
 package org.snipsnap.net;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpaceFactory;
-import org.snipsnap.snip.label.Label;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpaceFactory;
+import snipsnap.api.label.Label;
 import org.snipsnap.snip.label.LabelManager;
 import org.snipsnap.container.Components;
 import org.snipsnap.net.filter.MultipartWrapper;
@@ -51,7 +51,7 @@ import java.io.IOException;
 public class AddLabelServlet extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException {
-    Configuration config = Application.get().getConfiguration();
+    Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     // If this is not a multipart/form-data request continue
     String type = request.getHeader("Content-Type");
     if (type != null && type.startsWith("multipart/form-data")) {
@@ -66,7 +66,7 @@ public class AddLabelServlet extends HttpServlet {
   }
 
   public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = Application.get().getConfiguration();
 
     String snipName = request.getParameter("snipname");
     if (null == snipName) {
@@ -75,16 +75,16 @@ public class AddLabelServlet extends HttpServlet {
     }
     // cancel pressed
     if (null != request.getParameter("cancel")) {
-      response.sendRedirect(config.getUrl("/exec/labels?snipname=" + SnipLink.encode(snipName)));
+      response.sendRedirect(config.getUrl("/exec/labels?snipname=" + snipsnap.api.snip.SnipLink.encode(snipName)));
       return;
     }
 
-    Snip snip = SnipSpaceFactory.getInstance().load(snipName);
+    Snip snip = snipsnap.api.snip.SnipSpaceFactory.getInstance().load(snipName);
     request.setAttribute("snip", snip);
 
     String labelType = request.getParameter("labeltype");
     LabelManager manager = (LabelManager)Components.getComponent(LabelManager.class);
-    Label label = manager.getLabel(labelType);
+    snipsnap.api.label.Label label = manager.getLabel(labelType);
     request.setAttribute("label", label);
 
     RequestDispatcher dispatcher = request.getRequestDispatcher("/exec/addlabel.jsp");
blob - 6d02370f5afcec58cfeaf482fe70a0bf21741a9f
blob + ed80c31d1a0bd35e4999e2746075e415a79dc704
--- src/org/snipsnap/net/ChangePasswordServlet.java
+++ src/org/snipsnap/net/ChangePasswordServlet.java
@@ -24,15 +24,15 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.user.User;
+import snipsnap.api.app.Application;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.user.User;
 import org.snipsnap.user.UserManager;
 import org.snipsnap.user.PasswordService;
 import org.snipsnap.user.UserManagerFactory;
 import org.snipsnap.container.Components;
 import org.snipsnap.container.SessionService;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
@@ -61,7 +61,7 @@ public class ChangePasswordServlet extends HttpServlet
     String key = request.getParameter("key");
 
     if (request.getParameter("cancel") == null) {
-      User user;
+      snipsnap.api.user.User user;
       if (null != password1 && password1.equals(password2)) {
         PasswordService passwordService = (PasswordService) Components.getComponent(PasswordService.class);
         user = passwordService.changePassWord(key, password1);
@@ -73,15 +73,15 @@ public class ChangePasswordServlet extends HttpServlet
       }
 
       if (null != user) {
-        if (Application.getCurrentUsers().contains(user)) {
-          Application.getCurrentUsers().remove(user);
+        if (snipsnap.api.app.Application.getCurrentUsers().contains(user)) {
+          snipsnap.api.app.Application.getCurrentUsers().remove(user);
         }
         HttpSession session = request.getSession();
-        Application.get().setUser(user, session);
+        snipsnap.api.app.Application.get().setUser(user, session);
 
         SessionService service = (SessionService) Components.getComponent(SessionService.class);
         service.setUser(request, response, user);
-        response.sendRedirect(config.getUrl("/space/"+SnipLink.encode(user.getLogin())));
+        response.sendRedirect(config.getUrl("/space/"+snipsnap.api.snip.SnipLink.encode(user.getLogin())));
       } else {
         request.setAttribute("error", "user.password.error.keymismatch");
         RequestDispatcher dispatcher = request.getRequestDispatcher("/exec/forgot.jsp");
blob - 6eea2150853b50b550c67cbaa65d8969ab661866
blob + 01d0bd2c90182de05dc82ec20c0dcc83bccf9dc2
--- src/org/snipsnap/net/CommentStoreServlet.java
+++ src/org/snipsnap/net/CommentStoreServlet.java
@@ -25,16 +25,16 @@
 package org.snipsnap.net;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
 import org.snipsnap.net.filter.MultipartWrapper;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.SnipFormatter;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.user.AuthenticationService;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
@@ -53,7 +53,7 @@ import java.io.IOException;
 public class CommentStoreServlet extends HttpServlet {
   public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     // If this is not a multipart/form-data request continue
     String type = request.getHeader("Content-Type");
     if (type != null && type.startsWith("multipart/form-data")) {
@@ -66,7 +66,7 @@ public class CommentStoreServlet extends HttpServlet {
 
     String name = request.getParameter("comment");
     String content = request.getParameter("content");
-    Snip snip = SnipSpaceFactory.getInstance().load(name);
+    snipsnap.api.snip.Snip snip = SnipSpaceFactory.getInstance().load(name);
 
     if (request.getParameter("preview") != null) {
       request.setAttribute("snip", snip);
@@ -80,7 +80,7 @@ public class CommentStoreServlet extends HttpServlet {
 
       HttpSession session = request.getSession();
       if (session != null) {
-        User user = Application.get().getUser();
+        snipsnap.api.user.User user = snipsnap.api.app.Application.get().getUser();
         AuthenticationService service = (AuthenticationService) Components.getComponent(AuthenticationService.class);
 
         if (snip != null && service.isAuthenticated(user)) {
@@ -96,7 +96,7 @@ public class CommentStoreServlet extends HttpServlet {
       return;
     }
 
-    response.sendRedirect(config.getUrl("/comments/" + SnipLink.encode(name)));
+    response.sendRedirect(config.getUrl("/comments/" + snipsnap.api.snip.SnipLink.encode(name)));
   }
 
   private String sanitize(String parameter) {
blob - 258f51a7648bece02daf2812c13b608f797cbf00
blob + 68ff08cc200ff4828380853a6a88aae9360e6241
--- src/org/snipsnap/net/CommentViewServlet.java
+++ src/org/snipsnap/net/CommentViewServlet.java
@@ -24,11 +24,11 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpaceFactory;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpaceFactory;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
@@ -50,22 +50,22 @@ public class CommentViewServlet extends HttpServlet {
 
     String name = request.getPathInfo();
     if (null == name) {
-      Configuration config = Application.get().getConfiguration();
+      snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
 
-      response.sendRedirect(config.getUrl("/space/"+Application.get().getConfiguration().getStartSnip()));
+      response.sendRedirect(config.getUrl("/space/"+snipsnap.api.app.Application.get().getConfiguration().getStartSnip()));
       return;
     } else {
       name = name.substring(1);
     }
 
-    Snip snip = SnipSpaceFactory.getInstance().load(name.replace('+', ' '));
+    Snip snip = snipsnap.api.snip.SnipSpaceFactory.getInstance().load(name.replace('+', ' '));
     // Snip does not exist
     if (null == snip) {
       System.err.println("Snip does not exist: name=" + name);
-      snip = SnipSpaceFactory.getInstance().load("snipsnap-notfound");
+      snip = snipsnap.api.snip.SnipSpaceFactory.getInstance().load("snipsnap-notfound");
     }
 
-    Application app = Application.get();
+    snipsnap.api.app.Application app = snipsnap.api.app.Application.get();
     Map params = app.getParameters();
     params.put("viewed", snip);
     params.put("RSS", params.get("RSS") + "?snip=" + snip.getNameEncoded());
blob - e53c55bb2025179f72212acd1dcc081f2d21eb3a
blob + 4776a8b73deed4109b65783614b3c1845611b713
--- src/org/snipsnap/net/CssHandlerServlet.java
+++ src/org/snipsnap/net/CssHandlerServlet.java
@@ -24,11 +24,11 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 import org.snipsnap.util.ApplicationAwareMap;
 
 import javax.servlet.ServletException;
@@ -63,7 +63,7 @@ public class CssHandlerServlet extends HttpServlet {
     Timestamp cssTimestamp = (Timestamp) timeStamps.getMap().get(themeId);
     if (null == cssSnip || null == cssTimestamp || cssSnip.getMTime().after(cssTimestamp)) {
       SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
-      String snipName = Configuration.SNIPSNAP_THEMES + "/" + theme + ("/default.css".equals(id) ? "/css" : id);
+      String snipName = snipsnap.api.config.Configuration.SNIPSNAP_THEMES + "/" + theme + ("/default.css".equals(id) ? "/css" : id);
       cssSnip = space.load(snipName);
       styleSheets.getMap().put(themeId, cssSnip);
       timeStamps.getMap().put(themeId, cssSnip.getMTime().clone());
blob - a22731f32e1de89db22dadebc38f98da4f32db23
blob + f0a984aea930c0b01a14790f21a5c757b5229224
--- src/org/snipsnap/net/DiffServlet.java
+++ src/org/snipsnap/net/DiffServlet.java
@@ -24,11 +24,11 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 import org.snipsnap.versioning.VersionManager;
 
 import javax.servlet.RequestDispatcher;
@@ -52,7 +52,7 @@ public class DiffServlet extends HttpServlet {
 
     String name = request.getParameter("name");
     if (null == name) {
-      Configuration config = Application.get().getConfiguration();
+      Configuration config = snipsnap.api.app.Application.get().getConfiguration();
       response.sendRedirect(config.getUrl("/space/"+config.getStartSnip()));
       return;
     }
@@ -61,8 +61,8 @@ public class DiffServlet extends HttpServlet {
     int oldVersion = Integer.parseInt(oldString);
     int newVersion = Integer.parseInt(newString);
 
-    SnipSpace space = (SnipSpace)Components.getComponent(SnipSpace.class);
-    Snip snip = space.load(name);
+    snipsnap.api.snip.SnipSpace space = (snipsnap.api.snip.SnipSpace)Components.getComponent(snipsnap.api.snip.SnipSpace.class);
+    snipsnap.api.snip.Snip snip = space.load(name);
 
     VersionManager versionManager = (VersionManager) Components.getComponent(VersionManager.class);
     List diff = versionManager.diff(snip, oldVersion, newVersion);
blob - 1bc676c29b040874c15660aca1f898278349cbfc
blob + dbab213c6eb4d0f911e95c1c03c1e60085a2e332
--- src/org/snipsnap/net/FileDownloadServlet.java
+++ src/org/snipsnap/net/FileDownloadServlet.java
@@ -25,9 +25,9 @@
 package org.snipsnap.net;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.attachment.Attachment;
 import org.snipsnap.snip.attachment.storage.AttachmentStorage;
 import org.snipsnap.container.Components;
blob - ecaac81d83a4fad3f61690f1c88c018582ac13cd
blob + d79acd87d1e1593fe70a959e67455b582466cef2
--- src/org/snipsnap/net/FileUploadServlet.java
+++ src/org/snipsnap/net/FileUploadServlet.java
@@ -25,12 +25,12 @@
 package org.snipsnap.net;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.net.filter.MultipartWrapper;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.snip.attachment.Attachment;
 import org.snipsnap.snip.attachment.Attachments;
 import org.snipsnap.snip.attachment.storage.AttachmentStorage;
@@ -38,7 +38,7 @@ import org.snipsnap.snip.storage.XMLFileSnipStorage;
 import org.snipsnap.user.Permissions;
 import org.snipsnap.user.Roles;
 import org.snipsnap.user.Security;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 import org.snipsnap.container.Components;
 import org.snipsnap.security.AccessController;
 
@@ -95,7 +95,7 @@ public class FileUploadServlet extends HttpServlet {
       return;
     }
 
-    SnipSpace space = SnipSpaceFactory.getInstance();
+    snipsnap.api.snip.SnipSpace space = SnipSpaceFactory.getInstance();
     Snip snip = space.load(snipName);
 
     if (request.getParameter("cancel") != null) {
@@ -143,7 +143,7 @@ public class FileUploadServlet extends HttpServlet {
     dispatcher.forward(request, response);
   }
 
-  public String uploadFile(HttpServletRequest request, Snip snip) throws IOException {
+  public String uploadFile(HttpServletRequest request, snipsnap.api.snip.Snip snip) throws IOException {
     AttachmentStorage attachmentStorage = (AttachmentStorage) Components.getComponent(AttachmentStorage.class);
 
     MultipartWrapper wrapper = (MultipartWrapper) request;
@@ -175,7 +175,7 @@ public class FileUploadServlet extends HttpServlet {
 
       snip.getAttachments().addAttachment(attachment);
 
-      SnipSpaceFactory.getInstance().store(snip);
+      snipsnap.api.snip.SnipSpaceFactory.getInstance().store(snip);
       return fileName;
     }
     return null;
blob - 5ee316381db59416324f9073062917e83bdbd62a
blob + 2143f813ff9c539f7a3d42b84d49ef1068497b34
--- src/org/snipsnap/net/GroovyTemplateServlet.java
+++ src/org/snipsnap/net/GroovyTemplateServlet.java
@@ -26,9 +26,9 @@ package org.snipsnap.net;
 
 import groovy.text.SimpleTemplateEngine;
 import groovy.text.Template;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpace;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -72,7 +72,7 @@ public class GroovyTemplateServlet extends HttpServlet
    * @throws IOException
    */
   private String getTemplateSource(String name) throws IOException {
-    SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
+    SnipSpace space = (snipsnap.api.snip.SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class);
     if (space.exists(name)) {
       return space.load(name).getContent();
     }
blob - f8268c2e573a8910a3a988b070fc4f8ad5390b44
blob + d03c4da39bba126e34c17b97a6c17ccd73370ea3
--- src/org/snipsnap/net/HistoryServlet.java
+++ src/org/snipsnap/net/HistoryServlet.java
@@ -24,11 +24,11 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 import org.snipsnap.versioning.VersionManager;
 
 import javax.servlet.RequestDispatcher;
@@ -58,8 +58,8 @@ public class HistoryServlet extends HttpServlet {
       return;
     }
 
-    SnipSpace space = (SnipSpace)Components.getComponent(SnipSpace.class);
-    Snip snip = space.load(name);
+    snipsnap.api.snip.SnipSpace space = (snipsnap.api.snip.SnipSpace)Components.getComponent(SnipSpace.class);
+    snipsnap.api.snip.Snip snip = space.load(name);
 
     VersionManager versionManager = (VersionManager) Components.getComponent(VersionManager.class);
     List history = versionManager.getHistory(snip);
blob - 7cb7f68a4e53cefcbaadad019c91aab947ce32cf
blob + fdffa4912cb2dd49ec071f27725fedf3abad2b75
--- src/org/snipsnap/net/LabelsServlet.java
+++ src/org/snipsnap/net/LabelsServlet.java
@@ -25,14 +25,14 @@
 
 package org.snipsnap.net;
 
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpaceFactory;
-import org.snipsnap.snip.label.Label;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpaceFactory;
+import snipsnap.api.label.Label;
 import org.snipsnap.snip.label.LabelManager;
-import org.snipsnap.snip.label.Labels;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.label.Labels;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
 import org.snipsnap.net.filter.MultipartWrapper;
 import org.radeox.util.logging.Logger;
@@ -53,7 +53,7 @@ import java.util.Iterator;
 public class LabelsServlet extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException {
-    Configuration config = Application.get().getConfiguration();
+    Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     // If this is not a multipart/form-data request continue
     String type = request.getHeader("Content-Type");
     if (type != null && type.startsWith("multipart/form-data")) {
@@ -68,7 +68,7 @@ public class LabelsServlet extends HttpServlet {
   }
 
   public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
 
     String snipName = request.getParameter("snipname");
     if (null == snipName) {
@@ -82,7 +82,7 @@ public class LabelsServlet extends HttpServlet {
       return;
     }
 
-    Snip snip = SnipSpaceFactory.getInstance().load(snipName);
+    snipsnap.api.snip.Snip snip = SnipSpaceFactory.getInstance().load(snipName);
     request.setAttribute("snip", snip);
 
     LabelManager manager = (LabelManager) Components.getComponent(LabelManager.class);
blob - 578bd566cf07bd603338082e218ab1d3b258c39c
blob + eb6250bd09e6ea2581f548676a9011664dfabf22
--- src/org/snipsnap/net/Layouter.java
+++ src/org/snipsnap/net/Layouter.java
@@ -24,9 +24,9 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.snip.SnipLink;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletConfig;
@@ -57,7 +57,7 @@ public class Layouter extends HttpServlet {
     if (null == layout) {
       layout = SnipLink.decode(request.getPathInfo());
     }
-    Configuration config = Application.get().getConfiguration();
+    Configuration config = snipsnap.api.app.Application.get().getConfiguration();
 
     if (null == layout || "/".equals(layout)) {
       response.sendRedirect(config.getUrl("/space/" + config.getStartSnip()));
blob - cec77aaf0f0960adc3704a51c3b460b315f26992
blob + ff0c5d3e3bc9cb938c03d7e5406eb58941be6711
--- src/org/snipsnap/net/LoginServlet.java
+++ src/org/snipsnap/net/LoginServlet.java
@@ -25,13 +25,13 @@
 package org.snipsnap.net;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
 import org.snipsnap.container.SessionService;
 import org.snipsnap.net.filter.MultipartWrapper;
 import org.snipsnap.user.AuthenticationService;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
@@ -52,7 +52,7 @@ public class LoginServlet extends HttpServlet {
 
   public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = Application.get().getConfiguration();
 
     // If this is not a multipart/form-data request continue
     String type = request.getHeader("Content-Type");
@@ -69,7 +69,7 @@ public class LoginServlet extends HttpServlet {
     String referer = sanitize(request.getParameter("referer"));
 
     if (request.getParameter("cancel") == null) {
-      User user = ((AuthenticationService) Components.getComponent(AuthenticationService.class)).authenticate(login, password);
+      snipsnap.api.user.User user = ((AuthenticationService) Components.getComponent(AuthenticationService.class)).authenticate(login, password);
       if (Application.getCurrentUsers().contains(user)) {
         Application.getCurrentUsers().remove(user);
       }
@@ -102,7 +102,7 @@ public class LoginServlet extends HttpServlet {
           throws ServletException, IOException {
     String referer = request.getHeader("REFERER");
     if (referer == null || referer.length() == 0) {
-      Configuration config = Application.get().getConfiguration();
+      snipsnap.api.config.Configuration config = Application.get().getConfiguration();
       referer = config.getSnipUrl(config.getStartSnip());
     }
 
blob - a4a497dc6dad029273db74172f2c1a1f0194637e
blob + 676cd0a02bf07030f9cada2e4ca337ab20e84c5d
--- src/org/snipsnap/net/MailPasswordKeyServlet.java
+++ src/org/snipsnap/net/MailPasswordKeyServlet.java
@@ -24,10 +24,10 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.user.User;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.user.User;
 import org.snipsnap.user.UserManager;
 import org.snipsnap.user.PasswordService;
 import org.snipsnap.user.UserManagerFactory;
@@ -58,7 +58,7 @@ public class MailPasswordKeyServlet extends HttpServle
 
     if (request.getParameter("cancel") == null) {
       UserManager um = UserManagerFactory.getInstance();
-      User user = um.load(login);
+      snipsnap.api.user.User user = um.load(login);
 
       if (user == null) {
         request.setAttribute("error", "User name '" + login + "' does not exist!");
@@ -85,7 +85,7 @@ public class MailPasswordKeyServlet extends HttpServle
         return;
       }
     } else {
-      Configuration config = Application.get().getConfiguration();
+      snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
       response.sendRedirect(config.getUrl("/space/"+config.getStartSnip()));
       return;
     }
blob - 45dfb1b45db2d2f776ea42ac9cbd498a87ebc172
blob + a494d34246730a6ffa2168ae81a29780a7a8ca82
--- src/org/snipsnap/net/NewUserServlet.java
+++ src/org/snipsnap/net/NewUserServlet.java
@@ -25,14 +25,14 @@
 package org.snipsnap.net;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
 import org.snipsnap.container.SessionService;
 import org.snipsnap.net.filter.MultipartWrapper;
 import org.snipsnap.snip.HomePage;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.user.User;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.user.User;
 import org.snipsnap.user.UserManager;
 import org.snipsnap.user.UserManagerFactory;
 
@@ -62,7 +62,7 @@ public class NewUserServlet extends HttpServlet {
 
   public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
 
     // If this is not a multipart/form-data request continue
     String type = request.getHeader("Content-Type");
@@ -78,7 +78,7 @@ public class NewUserServlet extends HttpServlet {
     session.removeAttribute("errors");
     Map errors = new HashMap();
 
-    if (!config.deny(Configuration.APP_PERM_REGISTER)) {
+    if (!config.deny(snipsnap.api.config.Configuration.APP_PERM_REGISTER)) {
       String login = request.getParameter("login");
       String email = request.getParameter("email");
       String password = request.getParameter("password");
blob - bba7dc41bae409abda75feb1e6983e1a8e6dfc3e
blob + 2cc07efd6a4cc2563bc6512aa60f5caf9248bc6f
--- src/org/snipsnap/net/PluginServlet.java
+++ src/org/snipsnap/net/PluginServlet.java
@@ -27,10 +27,10 @@ package org.snipsnap.net;
 import groovy.text.SimpleTemplateEngine;
 import groovy.text.Template;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 import org.snipsnap.snip.label.TypeLabel;
 import org.snipsnap.user.Permissions;
 import org.snipsnap.user.Roles;
@@ -86,7 +86,7 @@ public class PluginServlet extends HttpServlet {
     // check for the plugin in the snip space which overrides other plugins
     SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
     if (space.exists(pluginName)) {
-      Snip snip = space.load(pluginName);
+      snipsnap.api.snip.Snip snip = space.load(pluginName);
       // only execute plugins who are locked by an Admin
       if (Security.existsPermission(Permissions.EDIT_SNIP, snip, EXEC_ROLES)) {
         String mimeType = getMIMEType(snip);
@@ -140,7 +140,7 @@ public class PluginServlet extends HttpServlet {
     return (ServletPlugin) pluginClass.newInstance();
   }
 
-  private String getMIMEType(Snip snip) {
+  private String getMIMEType(snipsnap.api.snip.Snip snip) {
     Collection mimeTypes = snip.getLabels().getLabels("TypeLabel");
     if (!mimeTypes.isEmpty()) {
       Iterator handlerIt = mimeTypes.iterator();
@@ -155,7 +155,7 @@ public class PluginServlet extends HttpServlet {
   private void handleGroovyTemplate(String source, Writer out) throws Exception {
     try {
       Template groovyTemplate = templateEngine.createTemplate(source);
-      groovyTemplate.make(Application.get().getParameters()).writeTo(out);
+      groovyTemplate.make(snipsnap.api.app.Application.get().getParameters()).writeTo(out);
     } catch (Error e) {
       e.printStackTrace();
       throw new ServletException("groovy error", e);
blob - 8287d6af140f76a00eb59d84cbc4a3d2064b8a47
blob + 0d6f04ed237c7f6cbdaf008957d768062521f61a
--- src/org/snipsnap/net/PostStoreServlet.java
+++ src/org/snipsnap/net/PostStoreServlet.java
@@ -25,16 +25,16 @@ package org.snipsnap.net;
  * --LICENSE NOTICE--
  */
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.snip.Blog;
 import org.snipsnap.snip.BlogKit;
 import org.snipsnap.snip.SnipFormatter;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.user.Roles;
 import org.snipsnap.user.Security;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 import org.snipsnap.net.filter.MultipartWrapper;
 import org.radeox.util.logging.Logger;
 
@@ -62,7 +62,7 @@ public class PostStoreServlet extends HttpServlet {
 
   public void doPost(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException {
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     // If this is not a multipart/form-data request continue
     String type = request.getHeader("Content-Type");
     if (type != null && type.startsWith("multipart/form-data")) {
@@ -98,7 +98,7 @@ public class PostStoreServlet extends HttpServlet {
       if (session != null) {
         User user = Application.get().getUser();
 //        AuthenticationService service = (AuthenticationService) Components.getComponent(AuthenticationService.class);
-        Blog blog = SnipSpaceFactory.getInstance().getBlog(snipName);
+        Blog blog = snipsnap.api.snip.SnipSpaceFactory.getInstance().getBlog(snipName);
 
         if (Security.hasRoles(user, blog.getSnip(), REQUIRED_ROLES)) {
           if (null == title || "".equals(title)) {
blob - 6a9596f78973b2ff34ccc85d1ed4c9d476d4fde9
blob + dd604f045393ae3b87bb297a642466642f0bc180
--- src/org/snipsnap/net/RdfServlet.java
+++ src/org/snipsnap/net/RdfServlet.java
@@ -25,11 +25,11 @@
 
 package org.snipsnap.net;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.config.ConfigurationProxy;
 import org.snipsnap.snip.Blog;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.serialization.SerializerFactory;
 import org.snipsnap.serialization.Serializer;
 import javax.servlet.RequestDispatcher;
@@ -48,7 +48,7 @@ import java.util.Properties;
  * @version $Id$
  */
 public class RdfServlet extends HttpServlet {
-    private Configuration config;
+    private snipsnap.api.config.Configuration config;
 
     public void init(ServletConfig servletConfig) throws ServletException {
         config = ConfigurationProxy.getInstance();
@@ -66,7 +66,7 @@ public class RdfServlet extends HttpServlet {
         name = name.replace('+', ' ');
 
         // load snip
-        Snip snip = SnipSpaceFactory.getInstance().load(name);
+        Snip snip = snipsnap.api.snip.SnipSpaceFactory.getInstance().load(name);
 
         // snip doesn't exist
         if (snip == null) {
blob - 75c3c59d41c065ea93c0c0e049259c66b44d9c5e
blob + 398bb1ed5958b18c9806b987b97c16f015cef665
--- src/org/snipsnap/net/RemoveLabelServlet.java
+++ src/org/snipsnap/net/RemoveLabelServlet.java
@@ -25,11 +25,11 @@
 
 package org.snipsnap.net;
 
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpaceFactory;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpaceFactory;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.net.filter.MultipartWrapper;
 import org.radeox.util.logging.Logger;
 
@@ -52,7 +52,7 @@ public class RemoveLabelServlet extends HttpServlet {
   }
 
   public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     // If this is not a multipart/form-data request continue
     String type = request.getHeader("Content-Type");
     if (type != null && type.startsWith("multipart/form-data")) {
@@ -70,16 +70,16 @@ public class RemoveLabelServlet extends HttpServlet {
     }
     // cancel pressed
     if (null != request.getParameter("cancel")) {
-      response.sendRedirect(config.getUrl("/exec/labels?snipname=" + SnipLink.encode(snipName)));
+      response.sendRedirect(config.getUrl("/exec/labels?snipname=" + snipsnap.api.snip.SnipLink.encode(snipName)));
       return;
     }
 
-    Snip snip = SnipSpaceFactory.getInstance().load(snipName);
+    snipsnap.api.snip.Snip snip = SnipSpaceFactory.getInstance().load(snipName);
     String labelName = request.getParameter("labelname");
     String labelValue = request.getParameter("labelvalue");
     snip.getLabels().removeLabel(labelName, labelValue);
 
-    RequestDispatcher dispatcher = request.getRequestDispatcher("/exec/labels?snipname=" + SnipLink.encode(snipName));
+    RequestDispatcher dispatcher = request.getRequestDispatcher("/exec/labels?snipname=" + snipsnap.api.snip.SnipLink.encode(snipName));
     dispatcher.forward(request, response);
   }
 }
blob - 7bf0749f67c87b35e0b44e5f31b3e46872211903
blob + dcd42b57375b5599e40232d11141e6f21397c123
--- src/org/snipsnap/net/RobotServlet.java
+++ src/org/snipsnap/net/RobotServlet.java
@@ -24,10 +24,10 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.container.Components;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -51,7 +51,7 @@ public class RobotServlet extends HttpServlet {
 
     SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
     if(space.exists(Configuration.SNIPSNAP_CONFIG_ROBOTS_TXT)) {
-      Snip robotstxt = space.load(Configuration.SNIPSNAP_CONFIG_ROBOTS_TXT);
+      snipsnap.api.snip.Snip robotstxt = space.load(Configuration.SNIPSNAP_CONFIG_ROBOTS_TXT);
       PrintWriter writer = new PrintWriter(response.getOutputStream());
       writer.println(robotstxt.getContent());
       writer.flush();
blob - ba3de238a11fbd034c8b430bd684c3929c3ab337
blob + 6e8f85cbd4ea6a2b03ea7ed7e1183615614d47ba
--- src/org/snipsnap/net/RsdServlet.java
+++ src/org/snipsnap/net/RsdServlet.java
@@ -24,10 +24,10 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.config.ConfigurationProxy;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpaceFactory;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletConfig;
blob - c6cac5d98b3ceedfea803e28651916c237b1bc58
blob + bbe0eb89c664ef73a34f2f72b9646dc04cc6e71d
--- src/org/snipsnap/net/ServletPluginLoader.java
+++ src/org/snipsnap/net/ServletPluginLoader.java
@@ -28,10 +28,10 @@ package org.snipsnap.net;
 import org.radeox.util.Service;
 import org.radeox.util.logging.Logger;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.label.Label;
-import org.snipsnap.snip.label.Labels;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.label.Label;
+import snipsnap.api.label.Labels;
 import org.snipsnap.snip.label.TypeLabel;
 import org.snipsnap.xmlrpc.XmlRpcHandler;
 import org.picocontainer.PicoContainer;
@@ -65,15 +65,15 @@ public class ServletPluginLoader {
    */
   private static Map getSnipPlugins() {
     Map snipPlugins = new HashMap();
-    SnipSpace snipspace = (SnipSpace) Components.getComponent(SnipSpace.class);
+    snipsnap.api.snip.SnipSpace snipspace = (snipsnap.api.snip.SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class);
     Iterator iterator = snipspace.getAll().iterator();
     while (iterator.hasNext()) {
       Snip snip = (Snip) iterator.next();
-      Labels labels = snip.getLabels();
+      snipsnap.api.label.Labels labels = snip.getLabels();
       boolean noLabelsAll = labels.getAll().isEmpty();
 
       if (!noLabelsAll) {
-        Label label = labels.getLabel("Type");
+        snipsnap.api.label.Label label = labels.getLabel("Type");
         if (null != label && label instanceof TypeLabel) {
           // only add labels that have the type text/gsp
           String type = ((TypeLabel) label).getTypeValue();
blob - ff2c536f9b4c86998872d29a7f6b207eaf48521a
blob + 7cdc94bf8bbe5a4959c417594480d245da94868c
--- src/org/snipsnap/net/SnipCopyServlet.java
+++ src/org/snipsnap/net/SnipCopyServlet.java
@@ -25,13 +25,13 @@
 package org.snipsnap.net;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
 import org.snipsnap.net.filter.MultipartWrapper;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpace;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
@@ -74,10 +74,10 @@ public class SnipCopyServlet extends HttpServlet {
       return;
     }
 
-    SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
+    snipsnap.api.snip.SnipSpace space = (SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class);
 
     if (null != name && space.exists(name)) {
-      Snip snip = space.load(name);
+      snipsnap.api.snip.Snip snip = space.load(name);
       if (request.getParameter("copy") != null) {
         String newName = request.getParameter("name");
         if (newName != null && newName.endsWith("/")) {
@@ -92,13 +92,13 @@ public class SnipCopyServlet extends HttpServlet {
           Snip subSnip = space.load(subSnipName);
           if (subSnip != null && subSnipName.startsWith(name)) {
             String newSubSnipName = newName + "/" + subsnips[s].substring(name.length() + 1);
-            Snip newSubSnip = subSnip.copy(newSubSnipName);
+            snipsnap.api.snip.Snip newSubSnip = subSnip.copy(newSubSnipName);
             Logger.log("SnipCopyServlet: copied " + subSnip.getName() + " to " + newSubSnip.getName());
           } else {
             Logger.warn("SnipCopyServlet: snip does not exist: " + subsnips[s]);
           }
         }
-        response.sendRedirect(config.getUrl("/space/" + SnipLink.encode(newName)));
+        response.sendRedirect(config.getUrl("/space/" + snipsnap.api.snip.SnipLink.encode(newName)));
         return;
       }
       request.setAttribute("name", name);
blob - 754137ba7eff7961dc4340462af0421c834a3d23
blob + 2f89ee5d01f21e89e473fc1ca1a04d93b1be2bb0
--- src/org/snipsnap/net/SnipEditServlet.java
+++ src/org/snipsnap/net/SnipEditServlet.java
@@ -26,13 +26,13 @@ package org.snipsnap.net;
 
 import org.radeox.util.Encoder;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
 import org.snipsnap.security.AccessController;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.label.Label;
-import org.snipsnap.snip.label.Labels;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.label.Label;
+import snipsnap.api.label.Labels;
 import org.snipsnap.snip.label.TypeLabel;
 import org.snipsnap.user.Permissions;
 import org.snipsnap.user.Roles;
@@ -73,10 +73,10 @@ public class SnipEditServlet extends HttpServlet {
     String type = request.getParameter("type");
     String editHandler = request.getParameter("handler");
 
-    SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
+    snipsnap.api.snip.SnipSpace space = (snipsnap.api.snip.SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class);
     AccessController controller = (AccessController) Components.getComponent(AccessController.class);
 
-    Snip snip = null;
+    snipsnap.api.snip.Snip snip = null;
     if (name != null && space.exists(name)) {
       snip = space.load(name);
       // get all mime types associated with the snip
@@ -156,12 +156,12 @@ public class SnipEditServlet extends HttpServlet {
   private List getTemplates() {
     List templates = new ArrayList();
 
-    SnipSpace snipspace = (SnipSpace) Components.getComponent(SnipSpace.class);
+    snipsnap.api.snip.SnipSpace snipspace = (snipsnap.api.snip.SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class);
     List snipList = snipspace.getAll();
 
     Iterator iterator = snipList.iterator();
     while (iterator.hasNext()) {
-      Snip snip = (Snip) iterator.next();
+      snipsnap.api.snip.Snip snip = (snipsnap.api.snip.Snip) iterator.next();
       Labels labels = snip.getLabels();
       boolean noLabelsAll = labels.getAll().isEmpty();
 
@@ -170,7 +170,7 @@ public class SnipEditServlet extends HttpServlet {
         if (!labelsCat.isEmpty()) {
           Iterator iter = labelsCat.iterator();
           while (iter.hasNext()) {
-            Label label = (Label) iter.next();
+            snipsnap.api.label.Label label = (Label) iter.next();
             if (label.getValue().equals("Template")) {
               templates.add(snip.getName());
             }
blob - a8cdb74e01ff29dd0d4536a189294456d1d5d1b5
blob + 5a7be280ee2d18761c6a4213bc96f6f0253c4d47
--- src/org/snipsnap/net/SnipLockServlet.java
+++ src/org/snipsnap/net/SnipLockServlet.java
@@ -24,15 +24,15 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.user.Permissions;
 import org.snipsnap.user.Roles;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -51,8 +51,8 @@ public class SnipLockServlet extends HttpServlet {
   public void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
     String name = request.getParameter("name");
-    SnipSpace space = SnipSpaceFactory.getInstance();
-    Snip snip = space.load(name);
+    SnipSpace space = snipsnap.api.snip.SnipSpaceFactory.getInstance();
+    snipsnap.api.snip.Snip snip = space.load(name);
 
     User user = Application.get().getUser();
     if (user != null && user.getRoles().containsAny(ALLOWED_ROLES)) {
@@ -68,7 +68,7 @@ public class SnipLockServlet extends HttpServlet {
       }
       space.store(snip);
     }
-    Configuration config = Application.get().getConfiguration();
-    response.sendRedirect(config.getUrl("/space/" + SnipLink.encode(name)));
+    snipsnap.api.config.Configuration config = Application.get().getConfiguration();
+    response.sendRedirect(config.getUrl("/space/" + snipsnap.api.snip.SnipLink.encode(name)));
   }
 }
\ No newline at end of file
blob - bf3419494fe4c8f2a81f71267d8b2e5713bc71de
blob + 2801b94c39ff08b694691282713fb5101df425a5
--- src/org/snipsnap/net/SnipRawServlet.java
+++ src/org/snipsnap/net/SnipRawServlet.java
@@ -24,13 +24,13 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.user.AuthenticationService;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -49,7 +49,7 @@ public class SnipRawServlet extends HttpServlet {
   public void doGet(HttpServletRequest request, HttpServletResponse response)
       throws IOException, ServletException {
 
-    User user = Application.get().getUser();
+    User user = snipsnap.api.app.Application.get().getUser();
     AuthenticationService service = (AuthenticationService) Components.getComponent(AuthenticationService.class);
 
     if (service.isAuthenticated(user)) {
@@ -58,17 +58,17 @@ public class SnipRawServlet extends HttpServlet {
 
     String name = request.getPathInfo();
     if (null == name || "/".equals(name)) {
-      name = Application.get().getConfiguration().getStartSnip();
+      name = snipsnap.api.app.Application.get().getConfiguration().getStartSnip();
     } else {
       name = name.substring(1);
     }
 
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = Application.get().getConfiguration();
     String encodedSpace = config.getEncodedSpace();
     if (encodedSpace != null && encodedSpace.length() > 0) {
       name = name.replace(encodedSpace.charAt(0), ' ');
     }
-    Snip snip = SnipSpaceFactory.getInstance().load(name);
+    snipsnap.api.snip.Snip snip = SnipSpaceFactory.getInstance().load(name);
 
     response.setContentType("text/plain; charset="+Application.get().getConfiguration().getEncoding());
     PrintWriter out = response.getWriter();
blob - 830117dc054553f7785ccb6eb498d1a2be832892
blob + 5d905f1c81a2184e001201211e89b4a94933ea72
--- src/org/snipsnap/net/SnipRemoveServlet.java
+++ src/org/snipsnap/net/SnipRemoveServlet.java
@@ -24,12 +24,12 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.user.User;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.user.User;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -47,13 +47,13 @@ public class SnipRemoveServlet extends HttpServlet {
   public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
     Application app = Application.get();
-    User user = app.getUser();
+    snipsnap.api.user.User user = app.getUser();
     Configuration config = app.getConfiguration();
 
     String name = request.getParameter("name");
     // TODO include check for current snip (see Access)
     if (user != null && user.isAdmin()) {
-      SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
+      snipsnap.api.snip.SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
       Snip snip = space.load(name);
 
       // check for comment and remove from comment list
blob - 2396d0997283802998523c6ed5cbd588fafa8dff
blob + 05a43a039b0539916b8922535dc27573e74360ff
--- src/org/snipsnap/net/SnipSearchServlet.java
+++ src/org/snipsnap/net/SnipSearchServlet.java
@@ -25,11 +25,11 @@
 package org.snipsnap.net;
 
 import org.apache.lucene.search.Hits;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.app.Application;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.app.Application;
 import org.snipsnap.components.SearchService;
 import org.snipsnap.container.Components;
 
blob - 6b2e504529ea6b58194704230e4d10faa2c8706c
blob + bd7ff02ef957b86d5fd59697b7ce5771340ce73c
--- src/org/snipsnap/net/SnipStoreServlet.java
+++ src/org/snipsnap/net/SnipStoreServlet.java
@@ -25,20 +25,20 @@
 package org.snipsnap.net;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
 import org.snipsnap.net.filter.MultipartWrapper;
 import org.snipsnap.security.AccessController;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.SnipFormatter;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.user.AuthenticationService;
 import org.snipsnap.user.Permissions;
 import org.snipsnap.user.Security;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
@@ -56,12 +56,12 @@ import java.io.IOException;
  */
 public class SnipStoreServlet extends HttpServlet {
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-    response.sendRedirect(Application.get().getConfiguration().getUrl());
+    response.sendRedirect(snipsnap.api.app.Application.get().getConfiguration().getUrl());
   }
 
   public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     // If this is not a multipart/form-data request continue
     String type = request.getHeader("Content-Type");
     if (type != null && type.startsWith("multipart/form-data")) {
@@ -99,7 +99,7 @@ public class SnipStoreServlet extends HttpServlet {
     }
 
     SnipSpace space = SnipSpaceFactory.getInstance();
-    Snip snip = space.load(name);
+    snipsnap.api.snip.Snip snip = space.load(name);
 
     RequestDispatcher dispatcher;
 
@@ -121,12 +121,12 @@ public class SnipStoreServlet extends HttpServlet {
     // handle requests that store using their own handler and forward (plugin)
     HttpSession session = request.getSession();
     if (session != null) {
-      User user = Application.get().getUser();
+      User user = snipsnap.api.app.Application.get().getUser();
       AuthenticationService service = (AuthenticationService) Components.getComponent(AuthenticationService.class);
       AccessController accessController = (AccessController) Components.getComponent(AccessController.class);
       String storeHandler = request.getParameter("store_handler");
       if (service.isAuthenticated(user) && (null == snip
-                                            || accessController.checkPermission(Application.get().getUser(), AccessController.EDIT_SNIP, snip))) {
+                                            || accessController.checkPermission(snipsnap.api.app.Application.get().getUser(), AccessController.EDIT_SNIP, snip))) {
         if (null != storeHandler) {
           dispatcher = request.getRequestDispatcher("/plugin/" + storeHandler);
           try {
blob - 18e4c9f025842672339afbc3cb4bea73d5b756d3
blob + 6c08f5040cb0e65bb98cac05c2fd11751da43920
--- src/org/snipsnap/net/SnipVersionServlet.java
+++ src/org/snipsnap/net/SnipVersionServlet.java
@@ -24,11 +24,11 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 import org.snipsnap.versioning.VersionManager;
 
 import javax.servlet.RequestDispatcher;
blob - fd3939aa3ca22cd66e9ca04aad0e28386d894c7f
blob + 97294c05813c28d8434f99d6794b1670f0118ae9
--- src/org/snipsnap/net/SnipViewServlet.java
+++ src/org/snipsnap/net/SnipViewServlet.java
@@ -25,15 +25,15 @@
 package org.snipsnap.net;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 import org.snipsnap.snip.label.TypeLabel;
 import org.snipsnap.user.AuthenticationService;
 import org.snipsnap.user.Roles;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 import org.snipsnap.util.URLEncoderDecoder;
 
 import javax.servlet.RequestDispatcher;
@@ -64,7 +64,7 @@ public class SnipViewServlet extends HttpServlet {
           throws IOException, ServletException {
 
     Configuration config = Application.get().getConfiguration();
-    User user = Application.get().getUser();
+    snipsnap.api.user.User user = snipsnap.api.app.Application.get().getUser();
     AuthenticationService service = (AuthenticationService) Components.getComponent(AuthenticationService.class);
 
     if (service.isAuthenticated(user)) {
@@ -85,8 +85,8 @@ public class SnipViewServlet extends HttpServlet {
 //    System.out.println("name='"+name+"'");
 
     // load snip and set attributes for request
-    SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
-    Snip snip = space.load(name);
+    SnipSpace space = (snipsnap.api.snip.SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class);
+    snipsnap.api.snip.Snip snip = space.load(name);
 
     String subname = null;
     if (null == snip) {
blob - 33e85b3f44a4032b95468d67ed15a6b7eadc5f60
blob + 134bc47ba42d82c5c608e2f4ae5b88ed5a27909a
--- src/org/snipsnap/net/StoreLabelServlet.java
+++ src/org/snipsnap/net/StoreLabelServlet.java
@@ -25,15 +25,15 @@
 package org.snipsnap.net;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
 import org.snipsnap.net.filter.MultipartWrapper;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
-import org.snipsnap.snip.label.Label;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
+import snipsnap.api.label.Label;
 import org.snipsnap.snip.label.LabelManager;
 
 import javax.servlet.ServletException;
@@ -55,7 +55,7 @@ import java.util.Map;
 public class StoreLabelServlet extends HttpServlet {
 
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = Application.get().getConfiguration();
     // If this is not a multipart/form-data request continue
     String type = request.getHeader("Content-Type");
     if (type != null && type.startsWith("multipart/form-data")) {
@@ -71,7 +71,7 @@ public class StoreLabelServlet extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws IOException, ServletException {
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
 
     String snipName = request.getParameter("snipname");
 
@@ -82,10 +82,10 @@ public class StoreLabelServlet extends HttpServlet {
     }
 
     if (null == request.getParameter("back")) {
-      Snip snip = ((SnipSpace) Components.getComponent(SnipSpace.class)).load(snipName);
+      Snip snip = ((SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class)).load(snipName);
       String labelType = request.getParameter("labeltype");
 
-      Label label = null;
+      snipsnap.api.label.Label label = null;
       if (null != labelType) {
         LabelManager manager = (LabelManager) Components.getComponent(LabelManager.class);
         label = manager.getLabel(labelType);
@@ -98,7 +98,7 @@ public class StoreLabelServlet extends HttpServlet {
     response.sendRedirect(config.getUrl("/exec/labels?snipname=" + SnipLink.encode(snipName)));
   }
 
-  private void handleLabel(Label label, HttpServletRequest request) {
+  private void handleLabel(snipsnap.api.label.Label label, HttpServletRequest request) {
     Map params = new HashMap();
     Enumeration enumeration = request.getParameterNames();
     while (enumeration.hasMoreElements()) {
blob - 69e3ed2208dd21dcf6510dd606135ae37878344f
blob + bcfe45b3cad91e8dc87b72552d9836ee017ee03d
--- src/org/snipsnap/net/ThemeImageServlet.java
+++ src/org/snipsnap/net/ThemeImageServlet.java
@@ -24,11 +24,11 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
@@ -50,9 +50,9 @@ public class ThemeImageServlet extends HttpServlet {
     String fileName = request.getPathInfo();
 
     if (fileName != null && fileName.length() > 1) {
-      Configuration config = Application.get().getConfiguration();
-      SnipSpace space = (SnipSpace)Components.getComponent(SnipSpace.class);
-      Snip themeSnip = space.load("SnipSnap/themes/"+config.getTheme());
+      snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
+      snipsnap.api.snip.SnipSpace space = (SnipSpace)Components.getComponent(SnipSpace.class);
+      snipsnap.api.snip.Snip themeSnip = space.load("SnipSnap/themes/"+config.getTheme());
 
       if(themeSnip != null) {
         request.setAttribute(FileDownloadServlet.FILENAME, fileName.substring(1));
blob - 75be4d2546448ed236b35b48ad15db60c9f83e93
blob + fe696bdf39f2f753e741e99b07a1eb777d11216a
--- src/org/snipsnap/net/VersionServlet.java
+++ src/org/snipsnap/net/VersionServlet.java
@@ -24,7 +24,7 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.config.ConfigurationProxy;
 
 import javax.servlet.RequestDispatcher;
blob - 04dcf787b4a058881c9a5c51bb23e975eab12b9c
blob + bc30b54a48d3b06792d216b197d84349d70f067f
--- src/org/snipsnap/net/admin/ConfigureServlet.java
+++ src/org/snipsnap/net/admin/ConfigureServlet.java
@@ -25,17 +25,17 @@
 package org.snipsnap.net.admin;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.app.ApplicationManager;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.config.ConfigurationManager;
 import org.snipsnap.config.ConfigurationProxy;
 import org.snipsnap.config.InitializeDatabase;
 import org.snipsnap.container.Components;
 import org.snipsnap.net.filter.MultipartWrapper;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.user.User;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.user.User;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
@@ -186,7 +186,7 @@ public class ConfigureServlet extends HttpServlet {
 
     String prefix = request.getParameter(ATT_PREFIX);
     if (null == prefix) {
-      prefix = (String) request.getAttribute(Configuration.APP_PREFIX);
+      prefix = (String) request.getAttribute(snipsnap.api.config.Configuration.APP_PREFIX);
     }
     if (prefix != null && config != null && !prefix.equals(config.getPrefix())) {
       session.removeAttribute(ATT_CONFIG);
@@ -221,10 +221,10 @@ public class ConfigureServlet extends HttpServlet {
     request.setAttribute(ATT_PREFIX, prefix);
 
     // TODO same as in InitFilter
-    Application app = Application.get();
+    snipsnap.api.app.Application app = snipsnap.api.app.Application.get();
     String xForwardedHost = request.getHeader("X-Forwarded-Host");
     if (xForwardedHost != null) {
-      String protocol = config.get(Configuration.APP_REAL_PROTOCOL, "http");
+      String protocol = config.get(snipsnap.api.config.Configuration.APP_REAL_PROTOCOL, "http");
       String contextPath = config.get(Configuration.APP_REAL_PATH, "");
 
       int colonIndex = xForwardedHost.indexOf(':');
@@ -232,9 +232,9 @@ public class ConfigureServlet extends HttpServlet {
       if (colonIndex != -1) {
         host = host.substring(0, colonIndex);
         int port = Integer.parseInt(xForwardedHost.substring(colonIndex + 1));
-        app.storeObject(Application.URL, new URL(protocol, host, port, contextPath));
+        app.storeObject(snipsnap.api.app.Application.URL, new URL(protocol, host, port, contextPath));
       } else {
-        app.storeObject(Application.URL, new URL(protocol, host, contextPath));
+        app.storeObject(snipsnap.api.app.Application.URL, new URL(protocol, host, contextPath));
       }
     } else {
       String protocol = new URL(request.getRequestURL().toString()).getProtocol();
@@ -242,10 +242,10 @@ public class ConfigureServlet extends HttpServlet {
       int port = request.getServerPort();
       String contextPath = request.getContextPath() + ("/".equals(prefix) ? "" : prefix);
 
-      app.storeObject(Application.URL, new URL(protocol, host, port, contextPath));
+      app.storeObject(snipsnap.api.app.Application.URL, new URL(protocol, host, port, contextPath));
     }
 
-    Application.get().setConfiguration(config);
+    snipsnap.api.app.Application.get().setConfiguration(config);
     session.setAttribute(ATT_CONFIG, config);
 
 //    if (config.allow(Configuration.APP_PERM_REGISTER) &&
@@ -260,7 +260,7 @@ public class ConfigureServlet extends HttpServlet {
 //      session.setAttribute(ATT_USAGE, "custom");
 //    }
 
-    User user = Application.get().getUser();
+    snipsnap.api.user.User user = snipsnap.api.app.Application.get().getUser();
     if (!config.isInstalled() || !config.isConfigured() || user.isAdmin()) {
       List steps = (List) session.getAttribute(ATT_STEPS);
       if (steps == null) {
@@ -274,7 +274,7 @@ public class ConfigureServlet extends HttpServlet {
           session.setAttribute(ATT_DEFAULTS, "true");
           session.setAttribute(ATT_USER, user);
         } else {
-          String installKey = (String) session.getAttribute(Configuration.APP_INSTALL_KEY);
+          String installKey = (String) session.getAttribute(snipsnap.api.config.Configuration.APP_INSTALL_KEY);
           if (null == installKey) {
             installKey = request.getParameter("key");
             if (null == installKey || !config.getInstallKey().equals(installKey)) {
@@ -285,7 +285,7 @@ public class ConfigureServlet extends HttpServlet {
               session.removeAttribute(ATT_CONFIG);
               return;
             }
-            session.setAttribute(Configuration.APP_INSTALL_KEY, installKey);
+            session.setAttribute(snipsnap.api.config.Configuration.APP_INSTALL_KEY, installKey);
           }
 
           steps = new ArrayList(BASIC_STEPS);
@@ -300,10 +300,10 @@ public class ConfigureServlet extends HttpServlet {
       if (session.getAttribute(ATT_DEFAULTS) == null) {
         Locale locale = request.getLocale();
         if (null != locale.getCountry() && !"".equals(locale.getCountry())) {
-          config.set(Configuration.APP_COUNTRY, locale.getCountry());
+          config.set(snipsnap.api.config.Configuration.APP_COUNTRY, locale.getCountry());
         }
         if (null != locale.getLanguage() && !"".equals(locale.getLanguage())) {
-          config.set(Configuration.APP_LANGUAGE, locale.getLanguage());
+          config.set(snipsnap.api.config.Configuration.APP_LANGUAGE, locale.getLanguage());
         }
         // divide offset (ms) by an hour
         int offset = TimeZone.getDefault().getRawOffset() / (60 * 60 * 1000);
@@ -370,10 +370,10 @@ public class ConfigureServlet extends HttpServlet {
               int idx = steps.indexOf(step);
               step = (String) steps.get(idx - 1);
             } else if (request.getParameter("save") != null) {
-              SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
+              SnipSpace space = (SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class);
               ByteArrayOutputStream configStream = new ByteArrayOutputStream();
               config.store(configStream);
-              Snip configSnip = space.load(Configuration.SNIPSNAP_CONFIG);
+              snipsnap.api.snip.Snip configSnip = space.load(Configuration.SNIPSNAP_CONFIG);
               configSnip.setContent(new String(configStream.toString("UTF-8")));
               space.store(configSnip);
 
blob - d53792d379ccb0bbce4ffaeba72b5d90c5ab5b1c
blob + 75fa57bdd4d9f17338f25a38a84946b34df38871
--- src/org/snipsnap/net/admin/DatabaseExport.java
+++ src/org/snipsnap/net/admin/DatabaseExport.java
@@ -25,12 +25,12 @@
  */
 package org.snipsnap.net.admin;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpace;
 import org.snipsnap.snip.XMLSnipExport;
 import org.snipsnap.user.UserManager;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.jdbc.IntHolder;
 import org.radeox.util.logging.Logger;
 
@@ -57,7 +57,7 @@ public class DatabaseExport implements SetupHandler {
   }
 
   public Map setup(HttpServletRequest request, HttpServletResponse response, Configuration config, Map errors) {
-    String appOid = (String) Application.get().getObject(Application.OID);
+    String appOid = (String) snipsnap.api.app.Application.get().getObject(snipsnap.api.app.Application.OID);
     ExportThread workerThread = (ExportThread) workerThreads.get(appOid);
     if (workerThread != null && workerThread.isAlive()) {
       setRunning(workerThread, request.getSession());
@@ -75,7 +75,7 @@ public class DatabaseExport implements SetupHandler {
     request.setAttribute("exportTypes", exportTypes);
 
     UserManager um = (UserManager) Components.getComponent(UserManager.class);
-    SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
+    snipsnap.api.snip.SnipSpace space = (SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class);
 
     List users = null;
     List snips = null;
blob - f945f01f65eaee1dfdf6024c855d2e1d14ffdcb9
blob + 5dde7ae16c1c5e9974ed90f73ea96c10eb44ef32
--- src/org/snipsnap/net/admin/DatabaseImport.java
+++ src/org/snipsnap/net/admin/DatabaseImport.java
@@ -25,12 +25,12 @@
  */
 package org.snipsnap.net.admin;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.jdbc.IntHolder;
 import org.snipsnap.net.filter.MultipartWrapper;
 import org.snipsnap.snip.XMLSnipImport;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -48,8 +48,8 @@ public class DatabaseImport implements SetupHandler {
     return "import";
   }
 
-  public Map setup(HttpServletRequest request, HttpServletResponse response, Configuration config, Map errors) {
-    String appOid = (String) Application.get().getObject(Application.OID);
+  public Map setup(HttpServletRequest request, HttpServletResponse response, snipsnap.api.config.Configuration config, Map errors) {
+    String appOid = (String) snipsnap.api.app.Application.get().getObject(snipsnap.api.app.Application.OID);
     ImportThread workerThread = (ImportThread) workerThreads.get(appOid);
     if (workerThread != null && workerThread.isAlive()) {
       setRunning(workerThread, request.getSession());
@@ -138,20 +138,20 @@ public class DatabaseImport implements SetupHandler {
     public ImportThread(InputStream file, int mask) {
       this.file = file;
       this.mask = mask;
-      this.appOid = (String)Application.get().getObject(Application.OID);
-      this.user = Application.get().getUser();
+      this.appOid = (String)snipsnap.api.app.Application.get().getObject(snipsnap.api.app.Application.OID);
+      this.user = snipsnap.api.app.Application.get().getUser();
     }
 
     public void run() {
-      Application.get().storeObject(Application.OID, appOid);
-      Application.get().setUser(user);
+      snipsnap.api.app.Application.get().storeObject(snipsnap.api.app.Application.OID, appOid);
+      snipsnap.api.app.Application.get().setUser(user);
 
-      Configuration config = Application.get().getConfiguration();
+      snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
 
       System.err.println("ConfigureServlet: Disabling weblogs ping and jabber notification ...");
       String ping = config.get(Configuration.APP_PERM_WEBLOGSPING);
       String noty = config.get(Configuration.APP_PERM_NOTIFICATION);
-      config.set(Configuration.APP_PERM_WEBLOGSPING, "deny");
+      config.set(snipsnap.api.config.Configuration.APP_PERM_WEBLOGSPING, "deny");
       config.set(Configuration.APP_PERM_NOTIFICATION, "deny");
 
       status = XMLSnipImport.getStatus();
@@ -166,7 +166,7 @@ public class DatabaseImport implements SetupHandler {
       }
 
       System.err.println("ConfigureServlet: Resetting weblogs ping and jabber notification to config settings ...");
-      config.set(Configuration.APP_PERM_WEBLOGSPING, ping);
+      config.set(snipsnap.api.config.Configuration.APP_PERM_WEBLOGSPING, ping);
       config.set(Configuration.APP_PERM_NOTIFICATION, noty);
     }
   }
blob - d1b9a40f2a7e0344753e3ad519a54f531abe3155
blob + 387be77a97a2a13ff3077413bf1c9aeea0d5b908
--- src/org/snipsnap/net/admin/Maintenance.java
+++ src/org/snipsnap/net/admin/Maintenance.java
@@ -26,13 +26,13 @@
 package org.snipsnap.net.admin;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
 import org.snipsnap.snip.Access;
 import org.snipsnap.snip.Links;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -54,7 +54,7 @@ public class Maintenance implements SetupHandler {
   private Map workerThreads = new HashMap();
 
   public Map setup(HttpServletRequest request, HttpServletResponse response, Configuration config, Map errors) {
-    String appOid = (String) Application.get().getObject(Application.OID);
+    String appOid = (String) Application.get().getObject(snipsnap.api.app.Application.OID);
     CheckConsistency workerThread = (CheckConsistency) workerThreads.get(appOid);
     if (workerThread != null && workerThread.isAlive()) {
       setRunning(workerThread, request.getSession());
@@ -134,8 +134,8 @@ public class Maintenance implements SetupHandler {
     }
 
     public void run() {
-      Application.get().storeObject(Application.OID, appOid);
-      SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
+      snipsnap.api.app.Application.get().storeObject(snipsnap.api.app.Application.OID, appOid);
+      SnipSpace space = (snipsnap.api.snip.SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class);
 
       if (!repair) {
         List allSnips = Collections.unmodifiableList(space.getAll());
@@ -144,7 +144,7 @@ public class Maintenance implements SetupHandler {
         snipCount = allSnips.size();
         Logger.debug("Need to check " + snipCount + " snips.");
         while (snipIt.hasNext()) {
-          Snip snip = (Snip) snipIt.next();
+          snipsnap.api.snip.Snip snip = (snipsnap.api.snip.Snip) snipIt.next();
           check(snip, space);
           if (!uniqeSnipNames.add(snip.getName())) {
             fixDuplicates.add(snip);
@@ -157,7 +157,7 @@ public class Maintenance implements SetupHandler {
         currentCount = 0;
         Iterator parentIt = fixParents.iterator();
         while (parentIt.hasNext()) {
-          Snip snip = (Snip) parentIt.next();
+          snipsnap.api.snip.Snip snip = (snipsnap.api.snip.Snip) parentIt.next();
           fixParent(snip);
           space.systemStore(snip);
           currentCount++;
@@ -165,7 +165,7 @@ public class Maintenance implements SetupHandler {
         }
         Iterator commentIt = fixComments.iterator();
         while (commentIt.hasNext()) {
-          Snip snip = (Snip) commentIt.next();
+          snipsnap.api.snip.Snip snip = (snipsnap.api.snip.Snip) commentIt.next();
           fixComment(snip, space);
           space.systemStore(snip);
           currentCount++;
@@ -174,7 +174,7 @@ public class Maintenance implements SetupHandler {
         List blackList = Access.getReferrerBlackList();
         Iterator spamIt = fixSpam.iterator();
         while (spamIt.hasNext()) {
-          Snip snip = (Snip) spamIt.next();
+          snipsnap.api.snip.Snip snip = (Snip) spamIt.next();
           Links backLinks = snip.getBackLinks();
 
           Iterator blackListIt = blackList.iterator();
@@ -238,7 +238,7 @@ public class Maintenance implements SetupHandler {
       return fixSpam;
     }
 
-    private void check(Snip snip, SnipSpace space) {
+    private void check(snipsnap.api.snip.Snip snip, SnipSpace space) {
       String snipName = snip.getName();
       if (snipName.startsWith("comment-")) {
         if (null == snip.getCommentedSnip() && (null == snip.getCommentedName() || "".equals(snip.getCommentedName()))) {
blob - 25daa67f08228df37e2ac9b2302231f0e156ceaf
blob + 3a4b74b2fcd56761832b1d7df0c0035955a3fc30
--- src/org/snipsnap/net/admin/ManageSearchEngine.java
+++ src/org/snipsnap/net/admin/ManageSearchEngine.java
@@ -25,10 +25,10 @@
  */
 package org.snipsnap.net.admin;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpace;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -42,7 +42,7 @@ public class ManageSearchEngine implements SetupHandle
 
   private Map indexerThreads = new HashMap();
 
-  public Map setup(HttpServletRequest request, HttpServletResponse response, Configuration config, Map errors) {
+  public Map setup(HttpServletRequest request, HttpServletResponse response, snipsnap.api.config.Configuration config, Map errors) {
     if (request.getParameter("reset") != null) {
       final String appOid = (String) Application.get().getObject(Application.OID);
       Thread indexerThread = (Thread) indexerThreads.get(appOid);
@@ -58,7 +58,7 @@ public class ManageSearchEngine implements SetupHandle
       }
       indexerThread = new Thread() {
         public void run() {
-          Application.get().storeObject(Application.OID, appOid);
+          snipsnap.api.app.Application.get().storeObject(snipsnap.api.app.Application.OID, appOid);
           ((SnipSpace) Components.getComponent(SnipSpace.class)).reIndex();
         }
       };
blob - ac6dfa87dd6428e458e620093edd2b469c3f91f5
blob + e789407acd4a414ddff4ed0d20deb0fea55f634a
--- src/org/snipsnap/net/admin/ManageUsers.java
+++ src/org/snipsnap/net/admin/ManageUsers.java
@@ -25,13 +25,13 @@
  */
 package org.snipsnap.net.admin;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.user.UserManager;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 import org.snipsnap.user.Roles;
 import org.snipsnap.container.Components;
 import org.snipsnap.snip.HomePage;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -53,17 +53,17 @@ public class ManageUsers implements SetupHandler {
       }
       return errors;
     } else if (request.getParameter("edit") != null) {
-      User user = um.load(request.getParameter("login"));
+      snipsnap.api.user.User user = um.load(request.getParameter("login"));
       request.setAttribute("editUser", user);
       request.setAttribute("edit", "true");
       if(null == user) {
-        request.setAttribute("editUser", new User());
+        request.setAttribute("editUser", new snipsnap.api.user.User());
         request.setAttribute("create", "true");
       }
     } else if (request.getParameter("save") != null || request.getParameter("create") != null) {
       request.setAttribute("edit", "true");
       String login = request.getParameter("config.users.login");
-      User user = um.load(login);
+      snipsnap.api.user.User user = um.load(login);
       if(request.getParameter("create") != null) {
         request.setAttribute("create", request.getParameter("create"));
 
@@ -75,10 +75,10 @@ public class ManageUsers implements SetupHandler {
             user = um.create(login, tmp.getPasswd(), tmp.getEmail());
             update(request, errors, user);
             if(errors.size() == 0) {
-              User currUser = Application.get().getUser();
+              User currUser = snipsnap.api.app.Application.get().getUser();
               Application.get().setUser(user);
               HomePage.create(user.getLogin());
-              Application.get().setUser(currUser);
+              snipsnap.api.app.Application.get().setUser(currUser);
             }
           }
         }
@@ -102,7 +102,7 @@ public class ManageUsers implements SetupHandler {
   /**
    * Update a user, check validity and equality of the input.
    */
-  private boolean update(HttpServletRequest request, Map errors, User user) {
+  private boolean update(HttpServletRequest request, Map errors, snipsnap.api.user.User user) {
 
     String email = request.getParameter("config.users.email");
     String nPass = request.getParameter("config.users.password");
blob - 2aa3ec69d6d0967e4e1519a4bfebeeee847457b5
blob + f1c95ba5590ff0f807b35a14ee9f471235e5453b
--- src/org/snipsnap/net/admin/SetupAdministrator.java
+++ src/org/snipsnap/net/admin/SetupAdministrator.java
@@ -25,7 +25,7 @@
  */
 package org.snipsnap.net.admin;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -48,7 +48,7 @@ public class SetupAdministrator implements SetupHandle
       if (password == null || password.length() == 0) {
         errors.put(Configuration.APP_ADMIN_PASSWORD, Configuration.APP_ADMIN_PASSWORD);
       } else if (!password.equals(verify)) {
-        errors.put(Configuration.APP_ADMIN_PASSWORD, Configuration.APP_ADMIN_PASSWORD + ".match");
+        errors.put(Configuration.APP_ADMIN_PASSWORD, snipsnap.api.config.Configuration.APP_ADMIN_PASSWORD + ".match");
       } else if (password.length() < 3) {
         errors.put(Configuration.APP_ADMIN_PASSWORD, Configuration.APP_ADMIN_PASSWORD + ".length");
       } else {
blob - 15bc8ca4bb6192edb936922c5e0e478b04ad8376
blob + 1693721e204d8b55237e7c7bffa80769f3c46497
--- src/org/snipsnap/net/admin/SetupApplication.java
+++ src/org/snipsnap/net/admin/SetupApplication.java
@@ -25,13 +25,13 @@
  */
 package org.snipsnap.net.admin;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.config.InitializeDatabase;
 import org.snipsnap.net.FileUploadServlet;
 import org.snipsnap.net.filter.MultipartWrapper;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -50,12 +50,12 @@ public class SetupApplication implements SetupHandler 
 
   public Map setup(HttpServletRequest request, HttpServletResponse response, Configuration config, Map errors) {
     config.setName(request.getParameter(Configuration.APP_NAME));
-    config.setTagline(request.getParameter(Configuration.APP_TAGLINE));
+    config.setTagline(request.getParameter(snipsnap.api.config.Configuration.APP_TAGLINE));
     if (request instanceof MultipartWrapper) {
       try {
         if (config.isConfigured()) {
-          SnipSpace space = SnipSpaceFactory.getInstance();
-          Snip snip = space.load(Configuration.SNIPSNAP_CONFIG);
+          snipsnap.api.snip.SnipSpace space = snipsnap.api.snip.SnipSpaceFactory.getInstance();
+          snipsnap.api.snip.Snip snip = space.load(Configuration.SNIPSNAP_CONFIG);
           String logoName = uploader.uploadFile(request, snip);
           if (logoName != null && !"".equals(logoName)) {
             config.setLogo(logoName);
blob - f3fdbca1c3f8f3531945014df28cf12afa3a2edc
blob + f037c14c04a58998c35b0459dcaae1a0f27feb7d
--- src/org/snipsnap/net/admin/SetupDatabase.java
+++ src/org/snipsnap/net/admin/SetupDatabase.java
@@ -25,7 +25,7 @@
  */
 package org.snipsnap.net.admin;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.config.Globals;
 import org.snipsnap.app.JDBCApplicationStorage;
 import org.snipsnap.snip.storage.JDBCSnipStorage;
@@ -50,7 +50,7 @@ public class SetupDatabase implements SetupHandler {
   /**
    * Set up the database which is the central data store
    */
-  public Map setup(HttpServletRequest request, HttpServletResponse response, Configuration config, Map errors) {
+  public Map setup(HttpServletRequest request, HttpServletResponse response, snipsnap.api.config.Configuration config, Map errors) {
     String database = request.getParameter(Configuration.APP_DATABASE);
     config.setDatabase(database);
 
blob - 055802eaa5513c828cd4869257c649ad556fa484
blob + d51678b75c7a8b4c92276b2f9f68e6ff575b7657
--- src/org/snipsnap/net/admin/SetupExpert.java
+++ src/org/snipsnap/net/admin/SetupExpert.java
@@ -27,7 +27,7 @@ package org.snipsnap.net.admin;
 
 import org.radeox.util.logging.LogHandler;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
blob - 432dfb7edee0c46f07583800e1aa00787d7cef38
blob + fa12da5616f0816c08e82b44ec5f922227f585e7
--- src/org/snipsnap/net/admin/SetupHandler.java
+++ src/org/snipsnap/net/admin/SetupHandler.java
@@ -26,7 +26,7 @@
 
 package org.snipsnap.net.admin;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
blob - e2502f86d46f86e4ee6cbf3fe4935597b63482c4
blob + f349f98169e22263b1269e98a685c589f07c098f
--- src/org/snipsnap/net/admin/SetupLocalization.java
+++ src/org/snipsnap/net/admin/SetupLocalization.java
@@ -25,7 +25,7 @@
  */
 package org.snipsnap.net.admin;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -45,27 +45,27 @@ public class SetupLocalization implements SetupHandler
   private final static List countries = Arrays.asList(Locale.getISOCountries());
   private final static List languages = Arrays.asList(Locale.getISOLanguages());
 
-  public Map setup(HttpServletRequest request, HttpServletResponse response, Configuration config, Map errors) {
+  public Map setup(HttpServletRequest request, HttpServletResponse response, snipsnap.api.config.Configuration config, Map errors) {
     String country = request.getParameter(Configuration.APP_COUNTRY);
     if (countries.contains(country)) {
       config.setCountry(country);
     } else {
-      errors.put(Configuration.APP_COUNTRY, Configuration.APP_COUNTRY);
+      errors.put(snipsnap.api.config.Configuration.APP_COUNTRY, Configuration.APP_COUNTRY);
     }
 
     String language = request.getParameter(Configuration.APP_LANGUAGE);
     if (languages.contains(language)) {
       config.setLanguage(language);
     } else {
-      errors.put(Configuration.APP_LANGUAGE, Configuration.APP_LANGUAGE);
+      errors.put(snipsnap.api.config.Configuration.APP_LANGUAGE, Configuration.APP_LANGUAGE);
     }
-    config.setTimezone(request.getParameter(Configuration.APP_TIMEZONE));
-    config.setWeblogDateFormat(request.getParameter(Configuration.APP_WEBLOGDATEFORMAT));
+    config.setTimezone(request.getParameter(snipsnap.api.config.Configuration.APP_TIMEZONE));
+    config.setWeblogDateFormat(request.getParameter(snipsnap.api.config.Configuration.APP_WEBLOGDATEFORMAT));
     try {
       DateFormat df = new SimpleDateFormat(config.getWeblogDateFormat());
       df.format(new Date());
     } catch (Exception e) {
-      errors.put(Configuration.APP_WEBLOGDATEFORMAT, Configuration.APP_WEBLOGDATEFORMAT);
+      errors.put(snipsnap.api.config.Configuration.APP_WEBLOGDATEFORMAT, snipsnap.api.config.Configuration.APP_WEBLOGDATEFORMAT);
     }
     String geoCoordinates = request.getParameter(Configuration.APP_GEOCOORDINATES);
     if (null != geoCoordinates && !"".equals(geoCoordinates)) {
@@ -75,7 +75,7 @@ public class SetupLocalization implements SetupHandler
         String latStr = geoCoordinates.substring(0, commaIdx).trim();
         String lonStr = geoCoordinates.substring(commaIdx + 1).trim();
         if (latStr.length() == 0 || lonStr.length() == 0) {
-          errors.put(Configuration.APP_GEOCOORDINATES, Configuration.APP_GEOCOORDINATES);
+          errors.put(snipsnap.api.config.Configuration.APP_GEOCOORDINATES, Configuration.APP_GEOCOORDINATES);
         } else {
           try {
             double latitude = Double.parseDouble(latStr);
@@ -83,15 +83,15 @@ public class SetupLocalization implements SetupHandler
             if (latitude >= -90 && latitude <= 90 && longitude >= -180 && longitude <= 180) {
               config.setGeoCoordinates(geoCoordinates);
             } else {
-              errors.put(Configuration.APP_GEOCOORDINATES, Configuration.APP_GEOCOORDINATES + ".range");
+              errors.put(snipsnap.api.config.Configuration.APP_GEOCOORDINATES, snipsnap.api.config.Configuration.APP_GEOCOORDINATES + ".range");
             }
           } catch (NumberFormatException e) {
-            errors.put(Configuration.APP_GEOCOORDINATES, Configuration.APP_GEOCOORDINATES + ".format");
+            errors.put(Configuration.APP_GEOCOORDINATES, snipsnap.api.config.Configuration.APP_GEOCOORDINATES + ".format");
             e.printStackTrace();
           }
         }
       } else {
-        errors.put(Configuration.APP_GEOCOORDINATES, Configuration.APP_GEOCOORDINATES);
+        errors.put(Configuration.APP_GEOCOORDINATES, snipsnap.api.config.Configuration.APP_GEOCOORDINATES);
       }
     }
     return errors;
blob - 4dee7e0e6e1d922916c753f6a1a6a8ecbb29ddda
blob + 42a8a998ec57b312dbf7a49d9077089cceeb621d
--- src/org/snipsnap/net/admin/SetupMail.java
+++ src/org/snipsnap/net/admin/SetupMail.java
@@ -25,7 +25,7 @@
  */
 package org.snipsnap.net.admin;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -53,7 +53,7 @@ public class SetupMail implements SetupHandler {
           socket.connect(new InetSocketAddress(address, 25), 5 * 1000);
           socket.close();
         } catch (IOException e) {
-          errors.put(Configuration.APP_MAIL_HOST, Configuration.APP_MAIL_HOST + ".connect");
+          errors.put(Configuration.APP_MAIL_HOST, snipsnap.api.config.Configuration.APP_MAIL_HOST + ".connect");
         }
       } catch (UnknownHostException e) {
         errors.put(Configuration.APP_MAIL_HOST, Configuration.APP_MAIL_HOST + ".unknown");
blob - 2a2e865b9e2f02f5c3f1bfc83291b14d4a6d3b0d
blob + 18d4c44ce1587e0182fd439e87849b8ce4986809
--- src/org/snipsnap/net/admin/SetupMoblog.java
+++ src/org/snipsnap/net/admin/SetupMoblog.java
@@ -25,7 +25,7 @@
  */
 package org.snipsnap.net.admin;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -53,25 +53,25 @@ public class SetupMoblog implements SetupHandler {
           socket.connect(new InetSocketAddress(address, 110), 5 * 1000);
           socket.close();
         } catch (IOException e) {
-          errors.put(Configuration.APP_MAIL_POP3_HOST, Configuration.APP_MAIL_POP3_HOST + ".connect");
+          errors.put(Configuration.APP_MAIL_POP3_HOST, snipsnap.api.config.Configuration.APP_MAIL_POP3_HOST + ".connect");
         }
       } catch (UnknownHostException e) {
-        errors.put(Configuration.APP_MAIL_POP3_HOST, Configuration.APP_MAIL_POP3_HOST + ".unknown");
+        errors.put(snipsnap.api.config.Configuration.APP_MAIL_POP3_HOST, Configuration.APP_MAIL_POP3_HOST + ".unknown");
       }
     }
 
-    String pop3User = request.getParameter(Configuration.APP_MAIL_POP3_USER);
+    String pop3User = request.getParameter(snipsnap.api.config.Configuration.APP_MAIL_POP3_USER);
     config.setMailPop3User(pop3User);
     String pop3Pass = request.getParameter(Configuration.APP_MAIL_POP3_PASSWORD);
     config.setMailPop3Password(pop3Pass);
-    String blogPass = request.getParameter(Configuration.APP_MAIL_BLOG_PASSWORD);
+    String blogPass = request.getParameter(snipsnap.api.config.Configuration.APP_MAIL_BLOG_PASSWORD);
     config.setMailBlogPassword(blogPass);
-    String pop3Interval = request.getParameter(Configuration.APP_MAIL_POP3_INTERVAL);
+    String pop3Interval = request.getParameter(snipsnap.api.config.Configuration.APP_MAIL_POP3_INTERVAL);
     config.setMailPop3Interval(pop3Interval);
 
     if (config.getMailPop3Host() != null && !"".equals(config.getMailPop3Host())) {
       if (pop3User == null || "".equals(pop3User)) {
-        errors.put(Configuration.APP_MAIL_POP3_USER, Configuration.APP_MAIL_POP3_USER);
+        errors.put(snipsnap.api.config.Configuration.APP_MAIL_POP3_USER, snipsnap.api.config.Configuration.APP_MAIL_POP3_USER);
       }
 
       if (blogPass == null || "".equals(blogPass) || blogPass.length() < 3) {
@@ -81,10 +81,10 @@ public class SetupMoblog implements SetupHandler {
       try {
         int interval = Integer.parseInt(pop3Interval);
         if (interval < 5) {
-          errors.put(Configuration.APP_MAIL_POP3_INTERVAL, Configuration.APP_MAIL_POP3_INTERVAL);
+          errors.put(Configuration.APP_MAIL_POP3_INTERVAL, snipsnap.api.config.Configuration.APP_MAIL_POP3_INTERVAL);
         }
       } catch (NumberFormatException e) {
-        errors.put(Configuration.APP_MAIL_POP3_INTERVAL, Configuration.APP_MAIL_POP3_INTERVAL + ".format");
+        errors.put(snipsnap.api.config.Configuration.APP_MAIL_POP3_INTERVAL, snipsnap.api.config.Configuration.APP_MAIL_POP3_INTERVAL + ".format");
       }
     }
 
blob - 716626732eb63e08c9bed3a2aa0aa391889cacc5
blob + 0b83f5f6274d21ff2b6fd55fe9d1084cb0206ad9
--- src/org/snipsnap/net/admin/SetupPermissions.java
+++ src/org/snipsnap/net/admin/SetupPermissions.java
@@ -25,7 +25,7 @@
  */
 package org.snipsnap.net.admin;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -39,8 +39,8 @@ public class SetupPermissions implements SetupHandler 
   public Map setup(HttpServletRequest request, HttpServletResponse response, Configuration config, Map errors) {
     config.setPermRegister(allowDeny(request.getParameter(Configuration.APP_PERM_REGISTER)));
     config.setPermWeblogsPing(allowDeny(request.getParameter(Configuration.APP_PERM_WEBLOGSPING)));
-    config.setPermNotification(allowDeny(request.getParameter(Configuration.APP_PERM_NOTIFICATION)));
-    config.setPermExternalImages(allowDeny(request.getParameter(Configuration.APP_PERM_EXTERNALIMAGES)));
+    config.setPermNotification(allowDeny(request.getParameter(snipsnap.api.config.Configuration.APP_PERM_NOTIFICATION)));
+    config.setPermExternalImages(allowDeny(request.getParameter(snipsnap.api.config.Configuration.APP_PERM_EXTERNALIMAGES)));
     config.setPermMultiplePosts(allowDeny(request.getParameter(Configuration.APP_PERM_MULTIPLEPOSTS)));
     return errors;
   }
blob - d42104ac38beca02990abcc143594be5d3bb629c
blob + 4cafc6407bb12fe276957dbd78c86655f79469a4
--- src/org/snipsnap/net/admin/SetupProxy.java
+++ src/org/snipsnap/net/admin/SetupProxy.java
@@ -25,7 +25,7 @@
  */
 package org.snipsnap.net.admin;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -41,7 +41,7 @@ public class SetupProxy implements SetupHandler {
     config.setRealAutodetect(autodetect);
     if ("false".equals(autodetect)) {
       config.setRealHost(request.getParameter(Configuration.APP_REAL_HOST));
-      String portStr = request.getParameter(Configuration.APP_REAL_PORT);
+      String portStr = request.getParameter(snipsnap.api.config.Configuration.APP_REAL_PORT);
       config.setRealPort(request.getParameter(Configuration.APP_REAL_PORT));
       if (portStr != null && !"".equals(portStr)) {
         try {
@@ -51,7 +51,7 @@ public class SetupProxy implements SetupHandler {
         }
       }
     }
-    String realProtocol = request.getParameter(Configuration.APP_REAL_PROTOCOL);
+    String realProtocol = request.getParameter(snipsnap.api.config.Configuration.APP_REAL_PROTOCOL);
     if (null != realProtocol && !"".equals(realProtocol)) {
       config.setRealProtocol(realProtocol.trim());
     }
blob - 26539a3a3b462dc9cf216d235932081be2f0e8a7
blob + 2b76e050ffef980f09feae9d43aa14977f14719a
--- src/org/snipsnap/net/admin/SetupTheme.java
+++ src/org/snipsnap/net/admin/SetupTheme.java
@@ -25,9 +25,9 @@
  */
 package org.snipsnap.net.admin;
 
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpace;
 import org.snipsnap.snip.XMLSnipExport;
 import org.snipsnap.snip.XMLSnipImport;
 import org.snipsnap.snip.storage.SnipSerializer;
blob - 83cbcccb0dbf1276f531ad0cecf60d8dbf1b93f0
blob + bbf1260901623dfc9934c54de8101e8d79ef8435
--- src/org/snipsnap/net/admin/ThemeHelper.java
+++ src/org/snipsnap/net/admin/ThemeHelper.java
@@ -28,10 +28,10 @@ import org.dom4j.Document;
 import org.dom4j.Element;
 import org.dom4j.io.SAXReader;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 
 import java.io.File;
 import java.io.FileReader;
@@ -47,8 +47,8 @@ public class ThemeHelper {
   public final static int CONTENT = 2;
 
   public static Map getInstalledThemes() {
-    SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
-    Snip[] themeSnips = space.match(THEME_PREFIX);
+    SnipSpace space = (snipsnap.api.snip.SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class);
+    snipsnap.api.snip.Snip[] themeSnips = space.match(THEME_PREFIX);
     Map themes = new HashMap();
     for (int t = 0; t < themeSnips.length; t++) {
       String name = themeSnips[t].getName();
blob - 7e65e6f06b33643fa7779027c23f19cec3167f2d
blob + 7456e3abd80ce326f755bcc8757491eb6388835a
--- src/org/snipsnap/net/admin/ThemeImageServlet.java
+++ src/org/snipsnap/net/admin/ThemeImageServlet.java
@@ -29,9 +29,9 @@ import org.apache.xmlrpc.Base64;
 import org.dom4j.Document;
 import org.dom4j.Element;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.attachment.Attachment;
 import org.snipsnap.snip.attachment.storage.AttachmentStorage;
 import org.snipsnap.container.Components;
@@ -57,7 +57,7 @@ public class ThemeImageServlet extends HttpServlet {
     Map installedThemes = ThemeHelper.getInstalledThemes();
     AttachmentStorage storage = (AttachmentStorage) Components.getComponent(AttachmentStorage.class);
     if(installedThemes.containsKey(name)) {
-      Snip themeSnip = (Snip)installedThemes.get(name);
+      Snip themeSnip = (snipsnap.api.snip.Snip)installedThemes.get(name);
       Attachment att = themeSnip.getAttachments().getAttachment("screenshot.png");
       if(att != null) {
         sendImage(response, storage.getInputStream(att),
blob - c8cbfbca6d0748204ecccc726693e5e37fd2023f
blob + 69483bc1f98aaa1386cd58a5d631ce009be24673
--- src/org/snipsnap/net/filter/EncRequestFilter.java
+++ src/org/snipsnap/net/filter/EncRequestFilter.java
@@ -25,7 +25,7 @@
 package org.snipsnap.net.filter;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.config.Globals;
 
 import javax.servlet.Filter;
blob - 660cc6b0c1a402d1faead0bacca068884c0b7b4b
blob + e3d321ed7f124c7522d92839d037e57c98468420
--- src/org/snipsnap/net/filter/InitFilter.java
+++ src/org/snipsnap/net/filter/InitFilter.java
@@ -27,21 +27,21 @@ package org.snipsnap.net.filter;
 import org.radeox.util.i18n.ResourceManager;
 import org.radeox.util.logging.LogHandler;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.app.ApplicationManager;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.config.ConfigurationManager;
 import org.snipsnap.config.ConfigurationProxy;
 import org.snipsnap.config.Globals;
 import org.snipsnap.config.ServerConfiguration;
 import org.snipsnap.container.Components;
 import org.snipsnap.container.SessionService;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.user.Digest;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
@@ -156,17 +156,17 @@ public class InitFilter implements Filter {
     ApplicationManager appManager = (ApplicationManager) Components.getComponent(ApplicationManager.class);
     Collection prefixes = appManager.getPrefixes();
     Iterator prefixIt = prefixes.iterator();
-    Application app = Application.get();
+    snipsnap.api.app.Application app = snipsnap.api.app.Application.get();
     int okCount = 0;
     boolean weblogsPing = false;
     while (prefixIt.hasNext()) {
       String prefix = (String) prefixIt.next();
       String appOid = appManager.getApplication(prefix);
-      app.storeObject(Application.OID, appOid);
+      app.storeObject(snipsnap.api.app.Application.OID, appOid);
 
       System.out.print(">> Loading: " + prefix + " ");
       Configuration appConfig = ConfigurationProxy.newInstance();
-      SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
+      snipsnap.api.snip.SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
       if (space.exists(Configuration.SNIPSNAP_CONFIG)) {
         Snip configSnip = space.load(Configuration.SNIPSNAP_CONFIG);
         String configContent = configSnip.getContent();
@@ -212,7 +212,7 @@ public class InitFilter implements Filter {
     String path = request.getServletPath();
 
     HttpSession session = request.getSession();
-    Application app = Application.forceGet();
+    snipsnap.api.app.Application app = snipsnap.api.app.Application.forceGet();
     ConfigurationManager configManager = ConfigurationManager.getInstance();
     ApplicationManager appManager = null;
 
@@ -248,7 +248,7 @@ public class InitFilter implements Filter {
       appOid = appManager.getApplication(prefix);
       appConfig = configManager.getConfiguration(appOid);
       app.setConfiguration(appConfig);
-      app.storeObject(Application.OID, appOid);
+      app.storeObject(snipsnap.api.app.Application.OID, appOid);
     }
 
     // make sure XML-RPC is handled directly after determining the instance
@@ -276,9 +276,9 @@ public class InitFilter implements Filter {
         if (colonIndex != -1) {
           host = host.substring(0, colonIndex);
           int port = Integer.parseInt(xForwardedHost.substring(colonIndex + 1));
-          app.storeObject(Application.URL, new URL(protocol, host, port, contextPath));
+          app.storeObject(snipsnap.api.app.Application.URL, new URL(protocol, host, port, contextPath));
         } else {
-          app.storeObject(Application.URL, new URL(protocol, host, contextPath));
+          app.storeObject(snipsnap.api.app.Application.URL, new URL(protocol, host, contextPath));
         }
       } else {
         String protocol = new URL(request.getRequestURL().toString()).getProtocol();
@@ -287,9 +287,9 @@ public class InitFilter implements Filter {
         String contextPath = request.getContextPath() + ("/".equals(prefix) ? "" : prefix);
 
         if (port != 80) {
-          app.storeObject(Application.URL, new URL(protocol, host, port, contextPath));
+          app.storeObject(snipsnap.api.app.Application.URL, new URL(protocol, host, port, contextPath));
         } else {
-          app.storeObject(Application.URL, new URL(protocol, host, contextPath));
+          app.storeObject(snipsnap.api.app.Application.URL, new URL(protocol, host, contextPath));
         }
       }
 //      System.out.println("autoconfigured url: " + appConfig.getUrl());
@@ -312,7 +312,7 @@ public class InitFilter implements Filter {
       request.setAttribute(Configuration.APP_PREFIX, prefix);
 
       session.setAttribute("app", app);
-      session.setAttribute("space", SnipSpaceFactory.getInstance());
+      session.setAttribute("space", snipsnap.api.snip.SnipSpaceFactory.getInstance());
 
       // check for a logged in user
       SessionService service = (SessionService) Components.getComponent(SessionService.class);
blob - 25df842d99dcbd3e3c2e27dcae2ef492a6464bdd
blob + 1f1b73b87919649e278807c54e40ac16a21ef655
--- src/org/snipsnap/net/iCalServlet.java
+++ src/org/snipsnap/net/iCalServlet.java
@@ -24,11 +24,11 @@
  */
 package org.snipsnap.net;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
-import org.snipsnap.user.User;
+import snipsnap.api.app.Application;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
+import snipsnap.api.user.User;
 import org.snipsnap.user.UserManager;
 import org.snipsnap.user.AuthenticationService;
 import org.snipsnap.user.UserManagerFactory;
@@ -116,12 +116,12 @@ public class iCalServlet extends HttpServlet {
   }
 
   protected void delete(String name, String file) {
-    SnipSpace space = SnipSpaceFactory.getInstance();
+    snipsnap.api.snip.SnipSpace space = snipsnap.api.snip.SnipSpaceFactory.getInstance();
     if (space.exists(name)) {
-      Snip userSnip = space.load(name);
+      snipsnap.api.snip.Snip userSnip = space.load(name);
       Iterator it = userSnip.getChildren().iterator();
       while (it.hasNext()) {
-        Snip snip = (Snip) it.next();
+        snipsnap.api.snip.Snip snip = (snipsnap.api.snip.Snip) it.next();
         if (snip.getName().equals("calendar-" + name + "-" + file)) {
           space.remove(snip);
         }
@@ -133,9 +133,9 @@ public class iCalServlet extends HttpServlet {
 
   protected void put(String name, String file,
                      HttpServletRequest request, HttpServletResponse response) throws IOException {
-    SnipSpace space = SnipSpaceFactory.getInstance();
+    snipsnap.api.snip.SnipSpace space = snipsnap.api.snip.SnipSpaceFactory.getInstance();
     if (space.exists(name)) {
-      Snip userSnip = space.load(name);
+      snipsnap.api.snip.Snip userSnip = space.load(name);
 
       BufferedReader r = request.getReader();
       content.setLength(0);
@@ -151,13 +151,13 @@ public class iCalServlet extends HttpServlet {
 
   protected void get(String name, String file,
                      HttpServletRequest request, HttpServletResponse response) throws IOException {
-    SnipSpace space = SnipSpaceFactory.getInstance();
+    snipsnap.api.snip.SnipSpace space = snipsnap.api.snip.SnipSpaceFactory.getInstance();
     if (space.exists(name)) {
       PrintWriter w = response.getWriter();
-      Snip userSnip = space.load(name);
+      snipsnap.api.snip.Snip userSnip = space.load(name);
       Iterator it = userSnip.getChildren().iterator();
       while (it.hasNext()) {
-        Snip snip = (Snip) it.next();
+        snipsnap.api.snip.Snip snip = (snipsnap.api.snip.Snip) it.next();
         if (snip.getName().equals("calendar-" + name + "-" + file)) {
           String content = snip.getContent();
           response.setContentLength(content.length());
blob - e4a46a782e900a4a7e7c238d52ec82aad568bdef
blob + 158ad291e1cd167b3412d9b6955cf776427d1a8c
--- src/org/snipsnap/notification/MessageService.java
+++ src/org/snipsnap/notification/MessageService.java
@@ -25,11 +25,11 @@
 
 package org.snipsnap.notification;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.notification.jabber.JabberNotifier;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.user.User;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.user.User;
 
 import java.util.ArrayList;
 import java.util.Iterator;
blob - 535d079664d8938fe31dce3c14b60e6411e3ff75
blob + 9097b4e9e97b881e159f290bd72e0ebe3545c866
--- src/org/snipsnap/notification/NotificationService.java
+++ src/org/snipsnap/notification/NotificationService.java
@@ -25,11 +25,11 @@
 
 package org.snipsnap.notification;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.notification.jabber.JabberNotifier;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.user.User;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.user.User;
 import org.snipsnap.container.Components;
 
 import java.util.ArrayList;
@@ -101,7 +101,7 @@ public class NotificationService implements Consumer {
 
   public void notify(StringBuffer buffer) {
     buffer.append(" by ");
-    buffer.append(Application.get().getUser().getLogin());
+    buffer.append(snipsnap.api.app.Application.get().getUser().getLogin());
     notify(buffer.toString());
   }
 
blob - 3fd044e54cf0fea4eb62b66ea209e3141d2f5ce6
blob + f40cf9fe32c4d5da3474583e771594bbf2124281
--- src/org/snipsnap/notification/jabber/JabberBot.java
+++ src/org/snipsnap/notification/jabber/JabberBot.java
@@ -29,7 +29,7 @@ import org.jivesoftware.smack.Chat;
 import org.jivesoftware.smack.XMPPConnection;
 import org.jivesoftware.smack.packet.Message;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 
 /**
  * Bot which communicates via Jabber IM. This Bot can
blob - 4764b423bdb08cd14bdada979650f07f150825fb
blob + 19c1e68fda68e3dbbcad8af2044e8b794cbe3cde
--- src/org/snipsnap/notification/jmdns/JmDnsService.java
+++ src/org/snipsnap/notification/jmdns/JmDnsService.java
@@ -26,7 +26,7 @@
 package org.snipsnap.notification.jmdns;
 
 import org.picocontainer.Startable;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 
 import javax.jmdns.JmDNS;
 import javax.jmdns.ServiceInfo;
blob - 4b0d9acfc091921da01dace2be2c8de793a0602d
blob + c4356d82f6130bf8f9f3d4a2fbbaa95e7d0d8087
--- src/org/snipsnap/render/SnipRenderEngine.java
+++ src/org/snipsnap/render/SnipRenderEngine.java
@@ -32,14 +32,14 @@ import org.radeox.api.engine.context.RenderContext;
 import org.radeox.engine.BaseRenderEngine;
 import org.radeox.filter.context.FilterContext;
 import org.radeox.util.Encoder;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.render.context.SnipRenderContext;
 import org.snipsnap.render.filter.context.SnipFilterContext;
 import org.snipsnap.serialization.StringBufferWriter;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.user.AuthenticationService;
 
 import java.io.IOException;
@@ -75,19 +75,19 @@ public class SnipRenderEngine extends BaseRenderEngine
   }
 
   public boolean showCreate() {
-    return authService.isAuthenticated(Application.get().getUser());
+    return authService.isAuthenticated(snipsnap.api.app.Application.get().getUser());
   }
 
   public void appendLink(StringBuffer buffer, String name, String view, String anchor) {
-    SnipLink.appendLink(buffer, name, view, anchor);
+    snipsnap.api.snip.SnipLink.appendLink(buffer, name, view, anchor);
   }
 
   public void appendLink(StringBuffer buffer, String name, String view) {
-    SnipLink.appendLink(buffer, name, view);
+    snipsnap.api.snip.SnipLink.appendLink(buffer, name, view);
   }
 
   public void appendCreateLink(StringBuffer buffer, String name, String view) {
-    Configuration config = Application.get().getConfiguration();
+    Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     String encodedSpace = config.getEncodedSpace();
 
     if(name.indexOf(encodedSpace.charAt(0)) == -1) {
@@ -98,7 +98,7 @@ public class SnipRenderEngine extends BaseRenderEngine
   }
 
   public String include(String name) {
-    Snip includeSnip = SnipSpaceFactory.getInstance().load(name);
+    snipsnap.api.snip.Snip includeSnip = SnipSpaceFactory.getInstance().load(name);
     if (null != includeSnip) {
       return includeSnip.getContent();
     } else {
@@ -111,7 +111,7 @@ public class SnipRenderEngine extends BaseRenderEngine
     if(null == externalImageLink) {
       Writer writer = new StringBufferWriter();
       try {
-        SnipLink.appendImage(writer, "Icon-Extlink", "&gt;&gt;");
+        snipsnap.api.snip.SnipLink.appendImage(writer, "Icon-Extlink", "&gt;&gt;");
       } catch (IOException e) {
         // ignore
       }
blob - ec1d8a7356c8a2312f106de518c52723552d297b
blob + d2dbd5fdbb2567240148937ea7a37f6d884d0ab6
--- src/org/snipsnap/render/context/SnipRenderContext.java
+++ src/org/snipsnap/render/context/SnipRenderContext.java
@@ -28,10 +28,10 @@ package org.snipsnap.render.context;
 import org.radeox.api.engine.context.RenderContext;
 import org.radeox.engine.context.BaseRenderContext;
 import org.radeox.util.i18n.ResourceManager;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.HashMap;
@@ -69,7 +69,7 @@ public class SnipRenderContext extends BaseRenderConte
 
     HttpServletRequest request =
       (HttpServletRequest) Application.get().getParameters().get("request");
-    Locale locale = Application.get().getConfiguration().getLocale();
+    Locale locale = snipsnap.api.app.Application.get().getConfiguration().getLocale();
     if(null != request && null != request.getLocale()) {
       ResourceManager.get().setLocale(request.getLocale(), request.getLocales());
     } else {
@@ -100,11 +100,11 @@ public class SnipRenderContext extends BaseRenderConte
     attributes = new HashMap();
     attributes.put(SNIP, snip);
     attributes.put(USER, Application.get().getUser());
-    attributes.put(VIEWED, Application.get().getParameters().get("viewed"));
+    attributes.put(VIEWED, snipsnap.api.app.Application.get().getParameters().get("viewed"));
     attributes.put(CONTAINER, Components.getContainer());
     HttpServletRequest request = (HttpServletRequest)Application.get().getParameters().get("request");
     attributes.put(HTTP_REQUEST, request);
-    attributes.put(HTTP_PARAMS, Application.get().getParameters());
+    attributes.put(HTTP_PARAMS, snipsnap.api.app.Application.get().getParameters());
   }
 
   public void setAttribute(Object key, Object value) {
blob - dc986d3c356c95cd1a7754fd98fa31faabf63034
blob + 6b6f3b67c4d7393a1582b1f95b97e92b61bbf053
--- src/org/snipsnap/render/filter/CalendarFilter.java
+++ src/org/snipsnap/render/filter/CalendarFilter.java
@@ -29,10 +29,10 @@ import org.radeox.filter.regex.RegexTokenFilter;
 import org.radeox.regex.MatchResult;
 import org.radeox.filter.context.FilterContext;
 import org.radeox.util.i18n.ResourceManager;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.render.filter.context.SnipFilterContext;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 import java.text.MessageFormat;
 import java.text.FieldPosition;
@@ -55,10 +55,10 @@ public class CalendarFilter extends RegexTokenFilter {
   private final static int CALENDAR_PREFIX_LENGTH = "calendar-".length();
 
   public void handleMatch(StringBuffer buffer, MatchResult result, FilterContext context) {
-    Snip snip = ((SnipFilterContext) context).getSnip();
-    Application app = Application.get();
-    Configuration config = app.getConfiguration();
-    Snip parent = snip.getParent();
+    snipsnap.api.snip.Snip snip = ((SnipFilterContext) context).getSnip();
+    snipsnap.api.app.Application app = snipsnap.api.app.Application.get();
+    snipsnap.api.config.Configuration config = app.getConfiguration();
+    snipsnap.api.snip.Snip parent = snip.getParent();
 
     StringBuffer linkBuffer = new StringBuffer();
     linkBuffer.append("<a href=\"");
blob - f6ea910bebd6b5922570e6ae9d9ee524e0555878
blob + 59da94e54ba68ddfe30d636a836ba6118d2d12b6
--- src/org/snipsnap/render/filter/PgpFilter.java
+++ src/org/snipsnap/render/filter/PgpFilter.java
@@ -30,8 +30,8 @@ import org.radeox.regex.MatchResult;
 import org.radeox.filter.context.FilterContext;
 import org.radeox.util.StringBufferWriter;
 import org.snipsnap.render.filter.context.SnipFilterContext;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
 
 import java.io.IOException;
 import java.io.Writer;
blob - b39fc47ce9ea8d7784d49448fd014ad165eaaf78
blob + d2efd58f1c00d872005d2f83c3ddd367932fb481
--- src/org/snipsnap/render/filter/context/SnipFilterContext.java
+++ src/org/snipsnap/render/filter/context/SnipFilterContext.java
@@ -29,7 +29,7 @@ import org.radeox.macro.parameter.MacroParameter;
 import org.radeox.filter.context.BaseFilterContext;
 import org.snipsnap.render.macro.parameter.SnipMacroParameter;
 import org.snipsnap.render.context.SnipRenderContext;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 /**
  * Special implementation of FilterContext to execute
@@ -41,13 +41,13 @@ import org.snipsnap.snip.Snip;
  */
 
 public class SnipFilterContext extends BaseFilterContext {
-  private Snip snip;
+  private snipsnap.api.snip.Snip snip;
 
-  public SnipFilterContext(Snip snip) {
+  public SnipFilterContext(snipsnap.api.snip.Snip snip) {
     this.snip = snip;
   }
 
-  public Snip getSnip() {
+  public snipsnap.api.snip.Snip getSnip() {
     return snip;
   }
 
blob - cf1b7315f62ad93bcc2864bd7876558d34a820e7
blob + 5b33f9ffda0ec7430f632ce2baea2e5738a66253
--- src/org/snipsnap/render/filter/links/BackLinks.java
+++ src/org/snipsnap/render/filter/links/BackLinks.java
@@ -29,7 +29,7 @@ import org.radeox.util.Encoder;
 import org.radeox.util.i18n.ResourceManager;
 import org.radeox.util.logging.Logger;
 import org.snipsnap.snip.Links;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.snip.SnipLink;
 import org.snipsnap.util.URLEncoderDecoder;
 
 import java.io.IOException;
blob - 9910808704c2c8c08cad5fd07359b7bdabcee401
blob + 971fd8caba64fc07397bccd24ce38f3ce307272a
--- src/org/snipsnap/render/filter/links/SnipLinks.java
+++ src/org/snipsnap/render/filter/links/SnipLinks.java
@@ -28,7 +28,7 @@ package org.snipsnap.render.filter.links;
 import org.radeox.util.logging.Logger;
 import org.radeox.util.i18n.ResourceManager;
 import org.snipsnap.snip.Links;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.snip.SnipLink;
 import org.snipsnap.util.ColorRange;
 
 import java.io.IOException;
blob - 023057554321ca66691ee93b508dee1ac501bdcc
blob + 08cbf9fb54190fd53b59351bad0c1f95e27c54a7
--- src/org/snipsnap/render/macro/AnchorMacro.java
+++ src/org/snipsnap/render/macro/AnchorMacro.java
@@ -27,8 +27,8 @@ package org.snipsnap.render.macro;
 
 import org.snipsnap.render.macro.parameter.SnipMacroParameter;
 import org.snipsnap.render.context.SnipRenderContext;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
 import org.radeox.util.i18n.ResourceManager;
 
 import java.io.IOException;
@@ -72,15 +72,15 @@ public class AnchorMacro extends SnipMacro {
       writer.write("<a href=\"");
       Snip snip = params.getSnipRenderContext().getSnip();
       if (null != snip) {
-        SnipLink.appendUrl(writer, snip.getName(), anchor);
+        snipsnap.api.snip.SnipLink.appendUrl(writer, snip.getName(), anchor);
       } else {
-        SnipLink.appendUrl(writer, "", anchor);
+        snipsnap.api.snip.SnipLink.appendUrl(writer, "", anchor);
       }
       writer.write("\" title=\"");
       MessageFormat mf = new MessageFormat(ResourceManager.getString("i18n.messages", "macro.anchor.permalink"));
       writer.write(mf.format(new Object[] { anchor }));
       writer.write("\">");
-      SnipLink.appendImage(writer, "Icon-Permalink", "");
+      snipsnap.api.snip.SnipLink.appendImage(writer, "Icon-Permalink", "");
       writer.write("</a>");
     }
     return;
blob - 6f33dd388f769a82b49dce912c7a363dcb992e5c
blob + ced41beccb546a85067691cc977bd6f052c5c0cb
--- src/org/snipsnap/render/macro/FieldMacro.java
+++ src/org/snipsnap/render/macro/FieldMacro.java
@@ -26,7 +26,7 @@
 package org.snipsnap.render.macro;
 
 import org.snipsnap.render.macro.parameter.SnipMacroParameter;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.snip.SnipLink;
 import org.radeox.util.i18n.ResourceManager;
 
 import java.io.IOException;
@@ -65,7 +65,7 @@ public class FieldMacro extends SnipMacro {
       if (params.getLength() >= 3) {
         SnipLink.appendUrl(writer, params.get("2"));
       } else {
-        SnipLink.appendUrl(writer, params.getSnipRenderContext().getSnip().getName());
+        snipsnap.api.snip.SnipLink.appendUrl(writer, params.getSnipRenderContext().getSnip().getName());
       }
       writer.write("\" method=\"get\">");
       writer.write("<input size=\"18\" name=\"");
blob - 9f46269dda294d1b90afd7e8da3167c2f7c9a935
blob + 18958f0f1703379146334804e1e9b841fa673724
--- src/org/snipsnap/render/macro/GraphMacro.java
+++ src/org/snipsnap/render/macro/GraphMacro.java
@@ -29,8 +29,8 @@ import org.radeox.util.Encoder;
 import org.radeox.util.i18n.ResourceManager;
 import org.snipsnap.net.RenderServlet;
 import org.snipsnap.render.macro.parameter.SnipMacroParameter;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
 
 import java.io.IOException;
 import java.io.Writer;
@@ -61,7 +61,7 @@ public class GraphMacro extends SnipMacro {
 
   public void execute(Writer writer, SnipMacroParameter params)
           throws IllegalArgumentException, IOException {
-    Snip snip = params.getSnipRenderContext().getSnip();
+    snipsnap.api.snip.Snip snip = params.getSnipRenderContext().getSnip();
     String name = snip.getName();
     String handler = params.get("handler", 0);
     writer.write("<img src=\"exec/render?name=");
blob - 59ebe11a5a5f9ef78a3443806d507a257b224771
blob + 9a6d4ebfd767f160294f3c76d124060b8840138c
--- src/org/snipsnap/render/macro/HotSnipMacro.java
+++ src/org/snipsnap/render/macro/HotSnipMacro.java
@@ -32,9 +32,9 @@ import org.radeox.macro.parameter.MacroParameter;
 import org.radeox.util.logging.Logger;
 import org.radeox.util.i18n.ResourceManager;
 import org.snipsnap.render.context.SnipRenderContext;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpace;
 
 import java.io.IOException;
 import java.io.Writer;
@@ -94,7 +94,7 @@ public class HotSnipMacro extends BaseMacro {
         }
         writer.write("</div><ul>");
         while (iterator.hasNext()) {
-          Snip hotSnip = (Snip) iterator.next();
+          snipsnap.api.snip.Snip hotSnip = (Snip) iterator.next();
           writer.write("<li><span class=\"count\">");
           writer.write("" + hotSnip.getViewCount());
           writer.write("</span>");
blob - c39816f89c673d27e1d50fffdde645f0e355f014
blob + c3987b5ed78fcf628c8eabea880e9ec30da4de10
--- src/org/snipsnap/render/macro/ImageMacro.java
+++ src/org/snipsnap/render/macro/ImageMacro.java
@@ -28,12 +28,12 @@ import org.radeox.api.engine.ImageRenderEngine;
 import org.radeox.api.engine.RenderEngine;
 import org.radeox.util.Encoder;
 import org.radeox.util.i18n.ResourceManager;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.render.macro.parameter.SnipMacroParameter;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpaceFactory;
 
 import java.io.IOException;
 import java.io.Writer;
@@ -62,7 +62,7 @@ public class ImageMacro extends SnipMacro {
   }
 
   public ImageMacro() {
-    config = Application.get().getConfiguration();
+    config = snipsnap.api.app.Application.get().getConfiguration();
   }
 
   public void execute(Writer writer, SnipMacroParameter params)
@@ -102,7 +102,7 @@ public class ImageMacro extends SnipMacro {
         String imageName = img;
 
         if (imageName.startsWith("http://") || imageName.startsWith("https://")) {
-          if (config.allow(Configuration.APP_PERM_EXTERNALIMAGES)) {
+          if (config.allow(snipsnap.api.config.Configuration.APP_PERM_EXTERNALIMAGES)) {
             appendExternalImage(writer, imageName, align);
           }
         } else {
@@ -113,7 +113,7 @@ public class ImageMacro extends SnipMacro {
             imageName = imageName.substring(0, dotIndex);
           }
 
-          Snip snip = params.getSnipRenderContext().getSnip();
+          snipsnap.api.snip.Snip snip = params.getSnipRenderContext().getSnip();
           int slashIndex = imageName.lastIndexOf('/');
           if (-1 != slashIndex) {
             String snipName = imageName.substring(0, slashIndex);
blob - 8c403718c83397a2d796ddac5168cbd338a2f52e
blob + 4daf17cb05c8eb07c343d02db103c15ddd590fa1
--- src/org/snipsnap/render/macro/IndexSnipMacro.java
+++ src/org/snipsnap/render/macro/IndexSnipMacro.java
@@ -28,9 +28,9 @@ package org.snipsnap.render.macro;
 import org.radeox.util.i18n.ResourceManager;
 import org.snipsnap.render.macro.parameter.SnipMacroParameter;
 import org.snipsnap.render.macro.list.Linkable;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpaceFactory;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpaceFactory;
+import snipsnap.api.snip.SnipLink;
 import org.snipsnap.util.collection.Collections;
 import org.snipsnap.util.collection.Filterator;
 
blob - 543665cd913881b18a2652fe57bfbb9ea134e783
blob + 0d308c98e9321d4b2c430fd768b5055fa7ec9871
--- src/org/snipsnap/render/macro/LabelSearchMacro.java
+++ src/org/snipsnap/render/macro/LabelSearchMacro.java
@@ -28,10 +28,10 @@ package org.snipsnap.render.macro;
 import org.radeox.util.i18n.ResourceManager;
 import org.snipsnap.container.Components;
 import org.snipsnap.render.macro.parameter.SnipMacroParameter;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.label.Label;
-import org.snipsnap.snip.label.Labels;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.label.Label;
+import snipsnap.api.label.Labels;
 
 import java.io.IOException;
 import java.io.Writer;
@@ -70,7 +70,7 @@ public class LabelSearchMacro extends ListOutputMacro 
     String name = params.get("name");
     String value = params.get("value");
 
-    SnipSpace snipspace = (SnipSpace) Components.getComponent(SnipSpace.class);
+    SnipSpace snipspace = (snipsnap.api.snip.SnipSpace) Components.getComponent(SnipSpace.class);
     List snipList = snipspace.getAll();
 
     List result = new ArrayList();
@@ -78,7 +78,7 @@ public class LabelSearchMacro extends ListOutputMacro 
     Iterator iterator = snipList.iterator();
     while (iterator.hasNext()) {
       Snip snip = (Snip) iterator.next();
-      Labels labels = snip.getLabels();
+      snipsnap.api.label.Labels labels = snip.getLabels();
       boolean noLabelsAll = labels.getAll().isEmpty();
 
       if (!noLabelsAll) {
blob - a39d37e13abd6c45539042aedc8d4795a64f47f1
blob + c3f2a743edf0633df9183bfa02cd81f6ac682a82
--- src/org/snipsnap/render/macro/LastLoginMacro.java
+++ src/org/snipsnap/render/macro/LastLoginMacro.java
@@ -29,7 +29,7 @@ import org.radeox.macro.BaseMacro;
 import org.radeox.macro.parameter.MacroParameter;
 import org.radeox.util.i18n.ResourceManager;
 import org.snipsnap.snip.Modified;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 import org.snipsnap.user.UserManagerFactory;
 
 import java.io.IOException;
blob - 7f5d6823f68968b441c735b3740c655bd1936bc1
blob + 24162d89e31441638583ecbb84c2f90f5ae6e953
--- src/org/snipsnap/render/macro/LastVisitMacro.java
+++ src/org/snipsnap/render/macro/LastVisitMacro.java
@@ -30,7 +30,7 @@ import org.radeox.macro.BaseMacro;
 import org.radeox.macro.parameter.MacroParameter;
 import org.radeox.util.i18n.ResourceManager;
 import org.snipsnap.snip.Modified;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 import org.snipsnap.user.UserManager;
 import org.snipsnap.user.UserManagerFactory;
 
blob - e658252027444ccb5d937e90abc1bbf9a00b0aa4
blob + e793173f99ac4979964a631c30a02fa15cf806c3
--- src/org/snipsnap/render/macro/LoginsMacro.java
+++ src/org/snipsnap/render/macro/LoginsMacro.java
@@ -25,7 +25,7 @@
 package org.snipsnap.render.macro;
 
 import org.radeox.util.i18n.ResourceManager;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.render.macro.parameter.SnipMacroParameter;
 
 import java.io.IOException;
blob - 132f6216108a66347e70e86840c278a60949eef5
blob + 79a06d847a9e5ff00e125f9bbf1ea423bc08c85c
--- src/org/snipsnap/render/macro/OnlineTimeMacro.java
+++ src/org/snipsnap/render/macro/OnlineTimeMacro.java
@@ -29,10 +29,10 @@ import org.radeox.macro.Macro;
 import org.radeox.macro.BaseMacro;
 import org.radeox.macro.parameter.MacroParameter;
 import org.radeox.util.i18n.ResourceManager;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.snip.Modified;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpaceFactory;
 
 import java.io.IOException;
 import java.io.Writer;
@@ -58,7 +58,7 @@ public class OnlineTimeMacro extends BaseMacro {
   public void execute(Writer writer, MacroParameter params)
       throws IllegalArgumentException, IOException {
 
-    Snip snip = SnipSpaceFactory.getInstance().load(Application.get().getConfiguration().getStartSnip());
+    snipsnap.api.snip.Snip snip = SnipSpaceFactory.getInstance().load(snipsnap.api.app.Application.get().getConfiguration().getStartSnip());
     MessageFormat mf = new MessageFormat(ResourceManager.getString("i18n.messages", "macro.onlinetime.age"),
                                          ResourceManager.getLocale("i18n.messages"));
     writer.write(mf.format(new Object[]{Modified.getNiceTime(snip.getModified().getcTime())}));
blob - 839db9e6f23734bb6be1f0e4eb900ab23af9d625
blob + 0982bad7f7e2047a51c32490ee330ec367fe9d93
--- src/org/snipsnap/render/macro/RecentChangesMacro.java
+++ src/org/snipsnap/render/macro/RecentChangesMacro.java
@@ -27,7 +27,7 @@ package org.snipsnap.render.macro;
 import org.radeox.util.logging.Logger;
 import org.radeox.util.i18n.ResourceManager;
 import org.snipsnap.render.macro.parameter.SnipMacroParameter;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.SnipSpaceFactory;
 
 import java.io.IOException;
 import java.io.Writer;
blob - 74ef12dd67e06ed77f545ca7e2f14c6aadfcd61b
blob + 9546d46785b6f6a1bcdfbd8532283a0e2c4da096
--- src/org/snipsnap/render/macro/SinceLastVisitMacro.java
+++ src/org/snipsnap/render/macro/SinceLastVisitMacro.java
@@ -26,8 +26,8 @@
 package org.snipsnap.render.macro;
 
 import org.snipsnap.render.macro.parameter.SnipMacroParameter;
-import org.snipsnap.snip.SnipSpaceFactory;
-import org.snipsnap.user.User;
+import snipsnap.api.snip.SnipSpaceFactory;
+import snipsnap.api.user.User;
 import org.snipsnap.user.UserManager;
 import org.snipsnap.user.UserManagerFactory;
 import org.radeox.util.i18n.ResourceManager;
@@ -72,10 +72,10 @@ public class SinceLastVisitMacro extends ListOutputMac
     }
 
     if (params.getLength() > 0) {
-      User user = UserManagerFactory.getInstance().load(userName);
+      snipsnap.api.user.User user = UserManagerFactory.getInstance().load(userName);
       // Logger.debug("Hashcode lastVisit=" + ((Object) user).hashCode());
       // Logger.debug("SinceLastVisit: " + user.getLastLogout());
-      Collection c = SnipSpaceFactory.getInstance().getSince(user.getLastLogout());
+      Collection c = snipsnap.api.snip.SnipSpaceFactory.getInstance().getSince(user.getLastLogout());
       output(writer, params.getSnipRenderContext().getSnip(),
              ResourceManager.getString("i18n.messages", "macro.sincelastvisit.title"),
              c, ResourceManager.getString("i18n.messages", "macro.sincelastvisit.nochanges"),
blob - 3edd0121ea9682d98278caca6c0555af17c82a13
blob + 5d911a38853febffb85d9e9febbcbca609706ca2
--- src/org/snipsnap/render/macro/SnipCountMacro.java
+++ src/org/snipsnap/render/macro/SnipCountMacro.java
@@ -29,7 +29,7 @@ import org.radeox.macro.Macro;
 import org.radeox.macro.BaseMacro;
 import org.radeox.macro.parameter.MacroParameter;
 import org.radeox.util.i18n.ResourceManager;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.SnipSpaceFactory;
 
 import java.io.IOException;
 import java.io.Writer;
blob - abc16fe7ea3fc0918c7987fb0a4011f505fd7177
blob + f2934319b14037b760a37ed0a2e8806edc712860
--- src/org/snipsnap/render/macro/SnipTreeMacro.java
+++ src/org/snipsnap/render/macro/SnipTreeMacro.java
@@ -29,10 +29,10 @@ package org.snipsnap.render.macro;
 import org.radeox.macro.BaseMacro;
 import org.radeox.macro.parameter.MacroParameter;
 import org.radeox.util.i18n.ResourceManager;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
 
 import java.io.IOException;
 import java.io.Writer;
@@ -56,7 +56,7 @@ public class SnipTreeMacro extends BaseMacro {
   private SnipSpace space;
 
   public SnipTreeMacro() {
-    space = SnipSpaceFactory.getInstance();
+    space = snipsnap.api.snip.SnipSpaceFactory.getInstance();
   }
 
   public String getName() {
blob - d23daff7f968b3aef825b46028fbb615bf7d4f61
blob + 9b5e6a3de8c0d709ba96995b91470c3233990a03
--- src/org/snipsnap/render/macro/SnipXrefMacro.java
+++ src/org/snipsnap/render/macro/SnipXrefMacro.java
@@ -31,11 +31,11 @@ import org.radeox.macro.BaseMacro;
 import org.radeox.macro.parameter.MacroParameter;
 import org.radeox.util.logging.Logger;
 import org.radeox.util.i18n.ResourceManager;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.user.AuthenticationService;
 import org.snipsnap.components.SearchService;
 
@@ -114,7 +114,7 @@ public class SnipXrefMacro extends BaseMacro {
       AuthenticationService service = (AuthenticationService) Components.getComponent(AuthenticationService.class);
 
       if (searchString != null && searchString.length() > 0 &&
-        !SnipSpaceFactory.getInstance().exists(searchString) &&
+        !snipsnap.api.snip.SnipSpaceFactory.getInstance().exists(searchString) &&
         service.isAuthenticated(Application.get().getUser())) {
         MessageFormat mf = new MessageFormat(ResourceManager.getString("i18n.messages", "macro.snipxref.norefs"));
         writer.write("<p>");
blob - d4da583afb6bbb96c6d08f2d4dca29a3e20ea858
blob + 6d78f9636d3f44d0b750d2d2d88d88a1274d6593
--- src/org/snipsnap/render/macro/UserSnipCountMacro.java
+++ src/org/snipsnap/render/macro/UserSnipCountMacro.java
@@ -26,7 +26,7 @@
 package org.snipsnap.render.macro;
 
 import org.snipsnap.render.macro.parameter.SnipMacroParameter;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.radeox.util.i18n.ResourceManager;
 
 import java.io.IOException;
@@ -59,7 +59,7 @@ public class UserSnipCountMacro extends ListOutputMacr
       throws IllegalArgumentException, IOException {
 
     if (params.getLength() == 1) {
-      Collection c = SnipSpaceFactory.getInstance().getByUser(params.get("0"));
+      Collection c = snipsnap.api.snip.SnipSpaceFactory.getInstance().getByUser(params.get("0"));
       writer.write(""+c.size());
     } else {
       throw new IllegalArgumentException("Number of arguments does not match");
blob - c5601c038fc9c1be999bddc57bd4fa4f6db9389f
blob + e2293f6da07d3bd2e1214b451eaf59b6b5c20f0e
--- src/org/snipsnap/render/macro/UserSnipMacro.java
+++ src/org/snipsnap/render/macro/UserSnipMacro.java
@@ -26,7 +26,7 @@
 package org.snipsnap.render.macro;
 
 import org.snipsnap.render.macro.parameter.SnipMacroParameter;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.radeox.util.i18n.ResourceManager;
 
 import java.io.IOException;
@@ -63,7 +63,7 @@ public class UserSnipMacro extends ListOutputMacro {
     }
 
     if (params.getLength() > 0) {
-      Collection c = SnipSpaceFactory.getInstance().getByUser(params.get("0"));
+      Collection c = snipsnap.api.snip.SnipSpaceFactory.getInstance().getByUser(params.get("0"));
       MessageFormat mf = new MessageFormat(ResourceManager.getString("i18n.messages", "macro.snipsbyuser.title"),
                                            ResourceManager.getLocale("i18n.messages"));
       output(writer, params.getSnipRenderContext().getSnip(),
blob - 474e8f92c4bbbb472635ed4d7b44bf2b6143e4f4
blob + b50d1885fe579d8ce2e7e8274893063d3378a8d9
--- src/org/snipsnap/render/macro/VersionMacro.java
+++ src/org/snipsnap/render/macro/VersionMacro.java
@@ -30,7 +30,7 @@ import org.radeox.macro.Macro;
 import org.radeox.macro.BaseMacro;
 import org.radeox.macro.parameter.MacroParameter;
 import org.radeox.util.i18n.ResourceManager;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 
 import java.io.IOException;
 import java.io.Writer;
blob - 7add3af2a19ed10c5ce25c46f173eaa953580f88
blob + 9d9ac4d94d7aec584f097f0a128578238e6b6aea
--- src/org/snipsnap/render/macro/WeblogMacro.java
+++ src/org/snipsnap/render/macro/WeblogMacro.java
@@ -26,15 +26,15 @@
 package org.snipsnap.render.macro;
 
 import org.radeox.util.i18n.ResourceManager;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.render.filter.links.BackLinks;
 import org.snipsnap.render.macro.parameter.SnipMacroParameter;
 import org.snipsnap.snip.Blog;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.snip.SnipUtil;
 import org.snipsnap.util.StringUtil;
 
@@ -53,10 +53,10 @@ import java.util.List;
  */
 
 public class WeblogMacro extends SnipMacro {
-  private SnipSpace space;
+  private snipsnap.api.snip.SnipSpace space;
 
   public WeblogMacro() {
-    space = SnipSpaceFactory.getInstance();
+    space = snipsnap.api.snip.SnipSpaceFactory.getInstance();
   }
 
   public String getName() {
@@ -122,7 +122,7 @@ public class WeblogMacro extends SnipMacro {
     while (iterator.hasNext()) {
       Object object = iterator.next();
       // System.err.println("Class="+object.getClass());
-      Snip entry = (Snip) object;
+      snipsnap.api.snip.Snip entry = (snipsnap.api.snip.Snip) object;
 
       String[] entryName = StringUtil.split(entry.getName(), "/");
       int slashOffset = entryName.length - 3;
@@ -136,7 +136,7 @@ public class WeblogMacro extends SnipMacro {
         writer.write("</div>");
       }
 
-      Configuration conf = Application.get().getConfiguration();
+      snipsnap.api.config.Configuration conf = Application.get().getConfiguration();
 
       writer.write(entry.getXMLContent());
       writer.write(" <a href=\"");
blob - 0f4652f5fa6e72005c506ac7b2513c2ada777ab6
blob + 84dcdc4c7ef21f344b822a8b37aa30b1069a8a06
--- src/org/snipsnap/render/macro/list/VerticalListFormatter.java
+++ src/org/snipsnap/render/macro/list/VerticalListFormatter.java
@@ -25,9 +25,9 @@
 package org.snipsnap.render.macro.list;
 
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpace;
 import org.snipsnap.user.UserManagerFactory;
 
 import java.io.IOException;
@@ -72,12 +72,12 @@ public class VerticalListFormatter implements ListForm
       while (nameIterator.hasNext()) {
         Object object = nameIterator.next();
         writer.write("<li>");
-        if (object instanceof Snip) {
+        if (object instanceof snipsnap.api.snip.Snip) {
           formatSnipName(object, writer);
         } else if (object instanceof Linkable) {
           writer.write(((Linkable) object).getLink());
         } else if (object instanceof Nameable) {
-          SnipLink.appendLink(writer, ((Nameable) object).getName());
+          snipsnap.api.snip.SnipLink.appendLink(writer, ((Nameable) object).getName());
         } else {
           writer.write(object.toString());
         }
@@ -92,17 +92,17 @@ public class VerticalListFormatter implements ListForm
   }
 
   private void formatSnipName(Object object, Writer writer) throws IOException {
-    Snip snip = (Snip) object;
+    Snip snip = (snipsnap.api.snip.Snip) object;
     String name = snip.getName();
     String realName = snip.getTitle();
     if (name.startsWith("comment-")) {
       int lastIndex = name.lastIndexOf("-");
-      SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
-      Snip commentedSnip = space.load(name.substring(name.indexOf("-") + 1, lastIndex));
+      SnipSpace space = (SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class);
+      snipsnap.api.snip.Snip commentedSnip = space.load(name.substring(name.indexOf("-") + 1, lastIndex));
       realName = commentedSnip.getTitle();
-      SnipLink.appendImage(writer, "Icon-Comment", "");
+      snipsnap.api.snip.SnipLink.appendImage(writer, "Icon-Comment", "");
       writer.write(" ");
-      SnipLink.appendLinkWithRoot(writer, SnipLink.getCommentsRoot(),
+      snipsnap.api.snip.SnipLink.appendLinkWithRoot(writer, snipsnap.api.snip.SnipLink.getCommentsRoot(),
                                   SnipLink.encode(commentedSnip.getName()) + "#" + name, realName);
       //SnipLink.appendLink(writer, name, realName);
       writer.write(" (");
@@ -110,7 +110,7 @@ public class VerticalListFormatter implements ListForm
       writer.write(")");
       // @TODO replace with Type Snip check
     } else if (UserManagerFactory.getInstance().exists(name)) {
-      SnipLink.appendImage(writer, "Icon-Person", "");
+      snipsnap.api.snip.SnipLink.appendImage(writer, "Icon-Person", "");
       writer.write(" ");
       SnipLink.appendLink(writer, ((Nameable) object).getName());
       //SnipLink.appendLinkWithRoot(writer, SnipLink.getCommentsRoot(), SnipLink.encode(realName) + "#" + name, realName);
blob - a07875659ae493e4e6a8f02319e664b75e6cd950
blob + 469ff5ab41b50b46b30a9185956babfa8bcfb8bd
--- src/org/snipsnap/render/macro/loader/GroovyMacroLoader.java
+++ src/org/snipsnap/render/macro/loader/GroovyMacroLoader.java
@@ -33,8 +33,8 @@ import org.snipsnap.container.Components;
 import org.snipsnap.notification.Consumer;
 import org.snipsnap.notification.Message;
 import org.snipsnap.notification.MessageService;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
@@ -96,8 +96,8 @@ public class GroovyMacroLoader extends MacroLoader imp
    */
   public Repository loadPlugins(Repository repository, Class klass) {
     if (null != repository) {
-      SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
-      Snip[] snips = space.match("SnipSnap/config/macros/");
+      snipsnap.api.snip.SnipSpace space = (snipsnap.api.snip.SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class);
+      snipsnap.api.snip.Snip[] snips = space.match("SnipSnap/config/macros/");
 
       for (int i = 0; i < snips.length; i++) {
         Snip snip = snips[i];
blob - abfbdd7d7957951b7483cfff8a2203a4b2e4aa3d
blob + 6cb9d91ced2f661fe96fe4d63891d915b236fd68
--- src/org/snipsnap/render/macro/parameter/SnipMacroParameter.java
+++ src/org/snipsnap/render/macro/parameter/SnipMacroParameter.java
@@ -27,7 +27,7 @@ package org.snipsnap.render.macro.parameter;
 
 import org.radeox.api.engine.context.RenderContext;
 import org.radeox.macro.parameter.BaseMacroParameter;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.render.context.SnipRenderContext;
 
 import java.util.HashMap;
blob - dbca5eedbfbf2c016e380c7b50e6ace60f83d206
blob + 86f5a74f1214fdc3c579f3e9c7d7d1fb830dbd17
--- src/org/snipsnap/security/AccessController.java
+++ src/org/snipsnap/security/AccessController.java
@@ -32,8 +32,8 @@ import gabriel.components.AccessManagerImpl;
 import gabriel.components.context.AccessContext;
 import gabriel.components.io.FileAclStore;
 import gabriel.components.parser.AclParser;
-import org.snipsnap.user.User;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.user.User;
+import snipsnap.api.snip.Snip;
 
 /**
  * Check for access to resources and operations
@@ -46,6 +46,6 @@ public interface AccessController {
   public static Permission EDIT_SNIP = new Permission("EDIT_SNIP");
   public static Permission ADD_ATTACHMENT = new Permission("ADD_ATTACHMENT");
 
-  boolean checkPermission(User user, Permission permission, AccessContext context);
-  boolean checkPermission(User user, Permission permission, Snip snip);
+  boolean checkPermission(snipsnap.api.user.User user, Permission permission, AccessContext context);
+  boolean checkPermission(snipsnap.api.user.User user, Permission permission, snipsnap.api.snip.Snip snip);
 }
blob - 8a3530bf3e19b41d3c02e71b49d269b0af558015
blob + cc28d70ef1d79805cb17ba6ec77b2dc3f57afcbe
--- src/org/snipsnap/security/DefaultAccessController.java
+++ src/org/snipsnap/security/DefaultAccessController.java
@@ -36,8 +36,8 @@ import gabriel.components.context.AccessContext;
 import gabriel.components.context.OwnerAccessContext;
 import gabriel.components.io.FileAclStore;
 import gabriel.components.parser.AclParser;
-import org.snipsnap.user.User;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.user.User;
+import snipsnap.api.snip.Snip;
 
 /**
  * Check for access to resources and operations
@@ -54,7 +54,7 @@ public class DefaultAccessController implements Access
     manager = new AccessManagerImpl(store);
   }
 
-  public boolean checkPermission(User user, Permission permission, Snip snip) {
+  public boolean checkPermission(User user, Permission permission, snipsnap.api.snip.Snip snip) {
     return checkPermission(user, permission, new OwnerAccessContext(snip));
   }
 
blob - 58eaba82fde2a2656db867dce639a1954d859eb5
blob + 5f67c1e3ccb7cacea9b6369a7360669a54d887c3
--- src/org/snipsnap/semanticweb/DublinCore.java
+++ src/org/snipsnap/semanticweb/DublinCore.java
@@ -25,9 +25,9 @@
 
 package org.snipsnap.semanticweb;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.snip.Snip;
 
 import java.text.SimpleDateFormat;
 import java.util.HashMap;
@@ -48,8 +48,8 @@ public class DublinCore {
   private static SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
   private static SimpleDateFormat year = new SimpleDateFormat("yyyy");
 
-  public static Map generate(Snip snip) {
-    Configuration conf = Application.get().getConfiguration();
+  public static Map generate(snipsnap.api.snip.Snip snip) {
+    snipsnap.api.config.Configuration conf = snipsnap.api.app.Application.get().getConfiguration();
     sf.setTimeZone(TimeZone.getTimeZone(conf.getTimezone()));
 
     Map dublinCore = new HashMap();
@@ -63,7 +63,7 @@ public class DublinCore {
     }
     dublinCore.put("date", date);
     dublinCore.put("type", "Text");
-    dublinCore.put("identifier", Application.get().getConfiguration().getSnipUrl(snip.getNameEncoded()));
+    dublinCore.put("identifier", snipsnap.api.app.Application.get().getConfiguration().getSnipUrl(snip.getNameEncoded()));
     dublinCore.put("copyright", "Copyright " + year.format(snip.getModified().getmTime()));
     dublinCore.put("language", conf.getLocale().getLanguage());
     return dublinCore;
blob - dad6f8d39c32aeff9a061cfeda27cc18d345b049
blob + d65e64c82a6f77e48571a4f81451044bdd022c86
--- src/org/snipsnap/semanticweb/rss/RssSnip.java
+++ src/org/snipsnap/semanticweb/rss/RssSnip.java
@@ -27,14 +27,15 @@ package org.snipsnap.semanticweb.rss;
 
 import org.radeox.api.engine.RenderEngine;
 import org.radeox.api.engine.context.RenderContext;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
 import org.snipsnap.render.context.SnipRenderContext;
 import org.snipsnap.snip.*;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.attachment.Attachments;
-import org.snipsnap.snip.label.Labels;
+import snipsnap.api.label.Labels;
 import org.snipsnap.user.Permissions;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
@@ -43,6 +44,8 @@ import java.sql.Timestamp;
 import java.util.List;
 
 import gabriel.Principal;
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.SnipSpaceFactory;
 
 /**
  * Encapsulates a Snip for RSS as RSS channels are more fine granular
@@ -52,30 +55,30 @@ import gabriel.Principal;
  * @version $Id$
  */
 
-public class RssSnip implements Snip {
-  private Snip snip;
+public class RssSnip implements snipsnap.api.snip.Snip {
+  private snipsnap.api.snip.Snip snip;
   private String url;
   private String title;
   private String content;
 
-  public RssSnip(Snip snip) {
+  public RssSnip(snipsnap.api.snip.Snip snip) {
     this.title = snip.getName();
     this.content = snip.getContent();
     this.snip = snip;
     this.url = "";
   }
 
-  public RssSnip(Snip snip, String content) {
+  public RssSnip(snipsnap.api.snip.Snip snip, String content) {
     this(snip);
     this.content = content;
   }
 
-  public RssSnip(Snip snip, String content, String title) {
+  public RssSnip(snipsnap.api.snip.Snip snip, String content, String title) {
     this(snip, content);
     this.title = title;
   }
 
-  public RssSnip(Snip snip, String content, String title, String url) {
+  public RssSnip(snipsnap.api.snip.Snip snip, String content, String title, String url) {
     this(snip, content, title);
     this.url = "#" + url.replace(' ', '_');
   }
@@ -142,7 +145,7 @@ public class RssSnip implements Snip {
   public String getXMLContent() {
     RenderEngine engine = (RenderEngine) Components.getComponent(Components.DEFAULT_ENGINE);
     RenderContext context = new SnipRenderContext(snip, SnipSpaceFactory.getInstance());
-    context.setParameters(Application.get().getParameters());
+    context.setParameters(snipsnap.api.app.Application.get().getParameters());
     return engine.render(content, context);
   }
 
@@ -195,7 +198,7 @@ public class RssSnip implements Snip {
     return snip.getOUser();
   }
 
-  public void setOUser(User oUser) {
+  public void setOUser(snipsnap.api.user.User oUser) {
     return;
   }
 
@@ -267,7 +270,7 @@ public class RssSnip implements Snip {
     return snip.getCUser();
   }
 
-  public void setCUser(User cUser) {
+  public void setCUser(snipsnap.api.user.User cUser) {
     return;
   }
 
@@ -279,7 +282,7 @@ public class RssSnip implements Snip {
     return snip.getMUser();
   }
 
-  public void setMUser(User mUser) {
+  public void setMUser(snipsnap.api.user.User mUser) {
     return;
   }
 
@@ -291,11 +294,11 @@ public class RssSnip implements Snip {
     return snip.getChildren();
   }
 
-  public void setCommentedSnip(Snip comment) {
+  public void setCommentedSnip(snipsnap.api.snip.Snip comment) {
     return;
   }
 
-  public Snip getCommentedSnip() {
+  public snipsnap.api.snip.Snip getCommentedSnip() {
     return snip.getCommentedSnip();
   }
 
@@ -315,23 +318,23 @@ public class RssSnip implements Snip {
     return snip.getChildrenModifiedOrder();
   }
 
-  public void addSnip(Snip snip) {
+  public void addSnip(snipsnap.api.snip.Snip snip) {
     return;
   }
 
-  public void removeSnip(Snip snip) {
+  public void removeSnip(snipsnap.api.snip.Snip snip) {
     return;
   }
 
-  public Snip getParent() {
+  public snipsnap.api.snip.Snip getParent() {
     return snip.getParent();
   }
 
-  public void setDirectParent(Snip parentSnip) {
+  public void setDirectParent(snipsnap.api.snip.Snip parentSnip) {
     return;
   }
 
-  public void setParent(Snip parentSnip) {
+  public void setParent(snipsnap.api.snip.Snip parentSnip) {
     return;
   }
 
@@ -351,7 +354,7 @@ public class RssSnip implements Snip {
     return snip.getAttachmentString();
   }
 
-  public Snip copy(String newName) {
+  public snipsnap.api.snip.Snip copy(String newName) {
     return new RssSnip(snip, content, title, url);
   }
 }
blob - be0c04c285284d8944cc76e468aff0162cd53485
blob + 1430813d971caf5bc576376162be3ec71997e2cf
--- src/org/snipsnap/semanticweb/rss/Rssify.java
+++ src/org/snipsnap/semanticweb/rss/Rssify.java
@@ -27,7 +27,7 @@ package org.snipsnap.semanticweb.rss;
 
 import org.radeox.util.logging.Logger;
 import org.radeox.filter.regex.MatchResult;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -44,7 +44,7 @@ import java.util.regex.Matcher;
  */
 
 public class Rssify {
-  public static List rssify(Snip snip) {
+  public static List rssify(snipsnap.api.snip.Snip snip) {
     return rssify(snip.getChildrenDateOrder());
   }
 
@@ -61,7 +61,7 @@ public class Rssify {
 
     Iterator iterator = snips.iterator();
     while (iterator.hasNext() && result.size() <= 10) {
-      Snip snip = (Snip) iterator.next();
+      snipsnap.api.snip.Snip snip = (snipsnap.api.snip.Snip) iterator.next();
 
       String content = snip.getContent();
       Matcher matcher = pattern.matcher(content);
blob - aca4f0b125cc6e6b5ee559edca21df903da2906b
blob + 7a6522ceef662cd2c3da731fd1a6ede8d2000bab
--- src/org/snipsnap/serialization/LabelSerializer.java
+++ src/org/snipsnap/serialization/LabelSerializer.java
@@ -1,5 +1,7 @@
 package org.snipsnap.serialization;
 
+import snipsnap.api.label.*;
+
 import java.util.List;
 
 /**
@@ -13,7 +15,7 @@ public interface LabelSerializer {
      * We don't want RDF/Jena specifics in this interface, so pass the serializer around and let LabelSerializer cast
      * it to specific subclasses
      */
-    public void serialize(LabelContext labelContext);
+    public void serialize(snipsnap.api.label.LabelContext labelContext);
 
     /**
      * A LabelSerializer may be able to support more than one type of Labels.
blob - 93cb77b89f8181459dd2e4d891fe8294f3b642c6
blob + 6b4489c6425e1a8c9ea9064faf6f19475dcff289
--- src/org/snipsnap/serialization/Serializer.java
+++ src/org/snipsnap/serialization/Serializer.java
@@ -2,7 +2,7 @@ package org.snipsnap.serialization;
 
 import java.io.Writer;
 import java.util.Properties;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 public abstract class Serializer {
 
@@ -21,7 +21,7 @@ public abstract class Serializer {
      * @param snip      the Snip to serialize (perhaps only the "entry point" or "root snip")
      * @param writer    a Writer to write generated RDF to
      */
-    public abstract void serialize(Snip snip, Writer writer);
+    public abstract void serialize(snipsnap.api.snip.Snip snip, Writer writer);
 
     /**
      * serialize the given Snip to the given Writer
@@ -29,7 +29,7 @@ public abstract class Serializer {
      * @param writer    a Writer to write generated RDF to
      * @param depth     How many levels of snips shall be serialized. Set to -1 if you want to serialize ALL of them.
      */
-    public abstract void serialize(Snip snip, Writer writer, int depth);
+    public abstract void serialize(snipsnap.api.snip.Snip snip, Writer writer, int depth);
 
     public int getOutputFormat() {
         return m_outputFormat;
blob - 4b45c1e87f4e8f4f75ec14a483d004a735685841
blob + 776c0e192db057d4de06c5b129e4bb97dbdfd9e2
--- src/org/snipsnap/serialization/rdf/DAMLSerializer.java
+++ src/org/snipsnap/serialization/rdf/DAMLSerializer.java
@@ -6,7 +6,7 @@ import java.io.Writer;
 import com.hp.hpl.jena.daml.common.*;
 import com.hp.hpl.mesa.rdf.jena.model.*;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.serialization.rdf.vocabulary.*;
 
 public class DAMLSerializer extends RDFSerializerBase {
@@ -19,7 +19,7 @@ public class DAMLSerializer extends RDFSerializerBase 
         return new DAMLModelImpl();
     }
 
-    protected void addSingleSnipToModel(Snip snip, Model m) throws RDFException {
+    protected void addSingleSnipToModel(snipsnap.api.snip.Snip snip, Model m) throws RDFException {
         DAMLModelImpl model = (DAMLModelImpl)m;
         String snipName = snip.getName();
         String snipContent = snip.getContent();
@@ -51,6 +51,6 @@ public class DAMLSerializer extends RDFSerializerBase 
     protected void writeModel(Model model, Writer writer) throws RDFException {
     }
 
-    protected void recursiveFillModel(Snip snip, Model model, int depth) throws RDFException {
+    protected void recursiveFillModel(snipsnap.api.snip.Snip snip, Model model, int depth) throws RDFException {
     }
 }
blob - 8d625d7b7128148ad96a57170588cb4d60899d6a
blob + 6f790ebfecf4e1fcb822e4f049ea213fbe69df62
--- src/org/snipsnap/serialization/rdf/DefaultDAMLLabelSerializer.java
+++ src/org/snipsnap/serialization/rdf/DefaultDAMLLabelSerializer.java
@@ -2,7 +2,7 @@ package org.snipsnap.serialization.rdf;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.snipsnap.serialization.LabelContext;
+import snipsnap.api.label.LabelContext;
 import org.snipsnap.serialization.LabelSerializer;
 import org.snipsnap.serialization.SerializerFactory;
 
blob - 351ec5335916f0a911d05ad2e80e021f9784870c
blob + 567072f76f6bd6e9c4fe08f5d9c34ff8092c9598
--- src/org/snipsnap/serialization/rdf/DefaultRDFLabelSerializer.java
+++ src/org/snipsnap/serialization/rdf/DefaultRDFLabelSerializer.java
@@ -3,7 +3,7 @@ package org.snipsnap.serialization.rdf;
 import java.util.ArrayList;
 import java.util.List;
 import org.snipsnap.serialization.LabelSerializer;
-import org.snipsnap.serialization.LabelContext;
+import snipsnap.api.label.LabelContext;
 import org.snipsnap.serialization.SerializerFactory;
 
 /** @author gis */
blob - b3ed66959bbca1501fab8d10309c3bb5bbd116d7
blob + d9f887223b321c92074818decce8e18d672f8e72
--- src/org/snipsnap/serialization/rdf/RDFLabelContext.java
+++ src/org/snipsnap/serialization/rdf/RDFLabelContext.java
@@ -1,11 +1,11 @@
 package org.snipsnap.serialization.rdf;
 
 import com.hp.hpl.mesa.rdf.jena.model.*;
-import org.snipsnap.serialization.LabelContext;
+import snipsnap.api.label.LabelContext;
 
 /** @author gis */
 
-public class RDFLabelContext extends LabelContext {
+public class RDFLabelContext extends snipsnap.api.label.LabelContext {
     public Model model;
     public Resource snipResource;
     public String uriPrefix;
blob - a21f7ed0562bb431f55ef02aba88d21fd887aed7
blob + 5345670ca713ba299d9683507f76341359a0e5be
--- src/org/snipsnap/serialization/rdf/RDFSerializer.java
+++ src/org/snipsnap/serialization/rdf/RDFSerializer.java
@@ -9,8 +9,10 @@ import com.hp.hpl.mesa.rdf.jena.vocabulary.*;
 import com.hp.hpl.mesa.rdf.jena.common.*;
 
 import org.snipsnap.snip.Links;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.label.*;
+import snipsnap.api.label.Label;
+import snipsnap.api.snip.SnipLink;
 import org.snipsnap.snip.attachment.*;
 import org.snipsnap.snip.label.*;
 import org.snipsnap.serialization.LabelSerializer;
@@ -32,7 +34,7 @@ public class RDFSerializer extends RDFSerializerBase {
    * Subclasses should only need to reimplement this method to add one single snip to the model,
    * and eventually createModel().
    */
-  protected void addSingleSnipToModel(Snip snip, Model model) throws RDFException {
+  protected void addSingleSnipToModel(snipsnap.api.snip.Snip snip, Model model) throws RDFException {
     Resource rootSnipResource = addSnipResource(model, snip);
     // add the Snip's comments to the model:
     rootSnipResource.addProperty(SNIP.comments, addCommentsBag(model, snip));
@@ -44,9 +46,9 @@ public class RDFSerializer extends RDFSerializerBase {
     addLabelsToModel(snip, model);
   }
 
-  protected final void addLabelsToModel(Snip snip, Model model) {
+  protected final void addLabelsToModel(snipsnap.api.snip.Snip snip, Model model) {
     LabelSerializerFactory factory = getLabelSerializerFactory();
-    Labels labels = snip.getLabels();
+    snipsnap.api.label.Labels labels = snip.getLabels();
     Iterator it = labels.getAll().iterator();
     Map serializers = new HashMap();
     while (it.hasNext()) {
@@ -81,7 +83,7 @@ public class RDFSerializer extends RDFSerializerBase {
     Iterator iterator = getLinksIterator(snip);
     if (iterator != null) {
       while (iterator.hasNext()) {
-        recursiveFillModel((Snip) iterator.next(), model, depth);
+        recursiveFillModel((snipsnap.api.snip.Snip) iterator.next(), model, depth);
       }
     }
   }
@@ -94,7 +96,7 @@ public class RDFSerializer extends RDFSerializerBase {
       Iterator iterator = getCommentsIterator(snip);
       if (iterator != null) {
         while (iterator.hasNext()) {
-          Snip comment = (Snip) iterator.next();
+          Snip comment = (snipsnap.api.snip.Snip) iterator.next();
           // add comment to model as new resource:
           Resource commentResource = addCommentResource(model, comment, snip);
           // add comment to the comments Bag:
@@ -164,7 +166,7 @@ public class RDFSerializer extends RDFSerializerBase {
     return snipResource;
   }
 
-  private Resource addCommentResource(Model model, Snip comment, Snip commentedSnip) {
+  private Resource addCommentResource(Model model, snipsnap.api.snip.Snip comment, snipsnap.api.snip.Snip commentedSnip) {
     Resource commentResource = null;
     try {
       commentResource = model.createResource(getSnipResURI(comment));
blob - 5e7b3bd33fd7465391f557e8e797dca50bd4f345
blob + f886fa388d593004a031fd3e160707830d550d65
--- src/org/snipsnap/serialization/rdf/RDFSerializerBase.java
+++ src/org/snipsnap/serialization/rdf/RDFSerializerBase.java
@@ -7,13 +7,13 @@ import java.util.List;
 import com.hp.hpl.mesa.rdf.jena.model.Resource;
 import com.hp.hpl.mesa.rdf.jena.model.Model;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.Links;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.label.Label;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.label.Label;
 import org.snipsnap.snip.attachment.*;
 import org.snipsnap.serialization.Serializer;
-import org.snipsnap.serialization.LabelContext;
+import snipsnap.api.label.LabelContext;
 import java.io.Writer;
 import com.hp.hpl.mesa.rdf.jena.model.RDFException;
 
@@ -59,7 +59,7 @@ public abstract class RDFSerializerBase extends Serial
     }
 
     /** Hook for subclasses to use a custom LabelContext */
-    protected LabelContext getLabelContext(Label label, Snip snip, Model model) {
+    protected LabelContext getLabelContext(snipsnap.api.label.Label label, Snip snip, Model model) {
         m_labelContext.snip = snip;
         m_labelContext.snipResource = getSnipResource(model, snip);
         m_labelContext.uriPrefix = _uriPrefix;
@@ -79,7 +79,7 @@ public abstract class RDFSerializerBase extends Serial
      * @param snip      the Snip to serialize (perhaps only the "entry point" or "root snip")
      * @param writer    a Writer to write generated RDF to
      */
-    public final void serialize(Snip snip, Writer writer) {
+    public final void serialize(snipsnap.api.snip.Snip snip, Writer writer) {
         serialize(snip, writer, 0); // just one level
     }
 
@@ -104,7 +104,7 @@ public abstract class RDFSerializerBase extends Serial
     }
 
     protected abstract Model createModel();
-    protected abstract void recursiveFillModel(Snip snip, Model model, int depth) throws RDFException;
+    protected abstract void recursiveFillModel(snipsnap.api.snip.Snip snip, Model model, int depth) throws RDFException;
     protected abstract void writeModel(Model model, Writer writer) throws RDFException;
 
     protected final static Iterator getCommentsIterator(Snip snip) {
@@ -134,7 +134,7 @@ public abstract class RDFSerializerBase extends Serial
         }
     }
 
-    protected Resource getSnipResource(Model model, Snip snip) {
+    protected Resource getSnipResource(Model model, snipsnap.api.snip.Snip snip) {
         Resource snipResource = null;
         try {
             snipResource = model.getResource(getSnipResURI(snip));
@@ -144,11 +144,11 @@ public abstract class RDFSerializerBase extends Serial
         return snipResource;
     }
 
-    protected String getSnipResURI(Snip snip) {
+    protected String getSnipResURI(snipsnap.api.snip.Snip snip) {
         return _uriPrefix + '#' + snip.getNameEncoded();
     }
 
-    protected String getAttachmentURL(Attachment att, Snip snip) {
+    protected String getAttachmentURL(Attachment att, snipsnap.api.snip.Snip snip) {
         String url = _uriPrefix.substring(0, _uriPrefix.lastIndexOf("/rdf"));
         url = url.concat("/space/" + SnipLink.encode(snip.getName()) + "/" + SnipLink.encode(att.getName()));
         return url;
blob - 5afbfd42a703dbdb0b3130a65cd2ad66df0edc04
blob + a92d5670a28b454ee40ffe6589b3685a6216d394
--- src/org/snipsnap/serialization/rdf/RDFSnipLabelSerializer.java
+++ src/org/snipsnap/serialization/rdf/RDFSnipLabelSerializer.java
@@ -6,9 +6,9 @@ import com.hp.hpl.mesa.rdf.jena.model.*;
 import com.hp.hpl.mesa.rdf.jena.vocabulary.RDF;
 import com.hp.hpl.mesa.rdf.jena.common.ResourceImpl;
 
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.label.Label;
-import org.snipsnap.serialization.LabelContext;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.label.Label;
+import snipsnap.api.label.LabelContext;
 import org.snipsnap.serialization.LabelSerializer;
 import org.snipsnap.serialization.SerializerFactory;
 import org.snipsnap.serialization.rdf.vocabulary.LABEL;
@@ -28,7 +28,7 @@ public class RDFSnipLabelSerializer implements LabelSe
         RDFLabelContext rdfLabelContext = (RDFLabelContext) labelContext;
         Model model = rdfLabelContext.model;
         Label label = rdfLabelContext.label;
-        Snip snip = rdfLabelContext.snip;
+        snipsnap.api.snip.Snip snip = rdfLabelContext.snip;
         Resource snipResource = rdfLabelContext.snipResource;
 		try {
 			if (labelsBag == null) {
blob - 9871d82b42d2a6d2a42faf1cefba0d64dd3b2b37
blob + e5e6f7ab868e37e5a487b606b3f54bd6aa29376c
--- src/org/snipsnap/serialization/rdf/RDFTypeLabelSerializer.java
+++ src/org/snipsnap/serialization/rdf/RDFTypeLabelSerializer.java
@@ -6,9 +6,9 @@ import com.hp.hpl.mesa.rdf.jena.model.*;
 import com.hp.hpl.mesa.rdf.jena.vocabulary.RDF;
 import com.hp.hpl.mesa.rdf.jena.common.ResourceImpl;
 
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.label.Label;
-import org.snipsnap.serialization.LabelContext;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.label.Label;
+import snipsnap.api.label.LabelContext;
 import org.snipsnap.serialization.LabelSerializer;
 import org.snipsnap.serialization.SerializerFactory;
 import org.snipsnap.serialization.rdf.vocabulary.LABEL;
@@ -20,11 +20,11 @@ import org.snipsnap.serialization.rdf.vocabulary.SNIP;
  */
 public class RDFTypeLabelSerializer implements LabelSerializer {
 
-    public void serialize(LabelContext labelContext) {
+    public void serialize(snipsnap.api.label.LabelContext labelContext) {
         if (!(labelContext instanceof RDFLabelContext))
             throw new RuntimeException("RDFTypeLabelSerializer expects an RDFLabelContext!");
         RDFLabelContext rdfLabelContext = (RDFLabelContext) labelContext;
-        Label label = rdfLabelContext.label;
+        snipsnap.api.label.Label label = rdfLabelContext.label;
         Resource snipResource = rdfLabelContext.snipResource;
 		try {
             snipResource.addProperty(RDF.type, label.getValue());
blob - 94331a493d484e88a017b411c20ab093c3e514af
blob + c2dd0c082612a17d5344c6c749e17c77588103a9
--- src/org/snipsnap/snip/Access.java
+++ src/org/snipsnap/snip/Access.java
@@ -26,9 +26,9 @@
 package org.snipsnap.snip;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 import org.snipsnap.util.ApplicationAwareMap;
 
 import javax.servlet.http.HttpServletRequest;
@@ -45,6 +45,11 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+
 /**
  * Stores Access information for a snip like viewCount, backLinks, ...
  *
@@ -68,11 +73,11 @@ public class Access {
   public static List getReferrerBlackList() {
     List cachedBlackList = (List) blackListCache.getObject();
 
-    SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
+    SnipSpace space = (SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class);
     if (space.exists(BLACKLIST)) {
       Snip blackListSnip = space.load(BLACKLIST);
       Timestamp mTime = blackListSnip.getMTime();
-      String appOid = (String) Application.get().getObject(Application.OID);
+      String appOid = (String) snipsnap.api.app.Application.get().getObject(snipsnap.api.app.Application.OID);
       Timestamp cachedMTime = (Timestamp) lastModified.get(appOid);
 
       // update blacklist from snip if it does not exist or is new
@@ -117,7 +122,7 @@ public class Access {
 
   // DO NOT store snip in Acess this creates problems with Aspects
   public void handle(String snipName, HttpServletRequest request) {
-    User user = Application.get().getUser();
+    User user = snipsnap.api.app.Application.get().getUser();
     if (!user.isNonUser()) {
       incViewCount();
 //      preparation for better link statistics
@@ -131,7 +136,7 @@ public class Access {
       if (null != referrer) {
         // Decode URL to remove jsessionid for example
         // referrer =
-        String domain = Application.get().getConfiguration().getUrl();
+        String domain = snipsnap.api.app.Application.get().getConfiguration().getUrl();
         if (referrer.startsWith(domain)) {
           int index = referrer.indexOf("/space/");
           // Does the referrer point to a snip ?
@@ -155,7 +160,7 @@ public class Access {
 
             String name = SnipLink.decode(url);
 
-            if (!Application.get().getConfiguration().getStartSnip().equals(name)
+            if (!snipsnap.api.app.Application.get().getConfiguration().getStartSnip().equals(name)
                 && !snipName.equals(name)) {
               snipLinks.addLink(name);
             }
blob - bc29f5b88f1f0588d0b12da01b1702f43a62aab4
blob + 16e911da1cf631291a3ebe7c1f6c4b9d6e427c89
--- src/org/snipsnap/snip/Blog.java
+++ src/org/snipsnap/snip/Blog.java
@@ -25,6 +25,9 @@
 
 package org.snipsnap.snip;
 
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.Snip;
+
 import java.sql.Date;
 import java.util.List;
 
@@ -39,7 +42,7 @@ import java.util.List;
 public interface Blog {
   public String getName();
 
-  public Snip post(String content, String title);
+  public snipsnap.api.snip.Snip post(String content, String title);
 
   public Snip post(String content);
 
blob - 1d0068926bc401b18b37da21d28bb6c1c65ff9c9
blob + 34ed0965784b28572af37bfa070845b971af752c
--- src/org/snipsnap/snip/BlogImpl.java
+++ src/org/snipsnap/snip/BlogImpl.java
@@ -27,7 +27,7 @@ package org.snipsnap.snip;
 
 import dynaop.Proxy;
 import dynaop.ProxyAware;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.date.Month;
 import org.snipsnap.semanticweb.rss.Rssify;
 import org.snipsnap.user.Permissions;
@@ -39,6 +39,10 @@ import java.util.Calendar;
 import java.util.GregorianCalendar;
 import java.util.List;
 
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+
 /**
  * BlogImpl for Blog.
  *
@@ -51,7 +55,7 @@ public class BlogImpl implements Blog, ProxyAware {
   private String startName;
   private String name;
   private Snip blog;
-  private SnipSpace space;
+  private snipsnap.api.snip.SnipSpace space;
 
   public BlogImpl(SnipSpace space, String blogName) {
     this.space = space;
blob - a5edf37f870a5dd06a539fabfe038d7ca9a9d4aa
blob + 689221f91be725e97ac5764e9beaf84ac91e5dcc
--- src/org/snipsnap/snip/Comments.java
+++ src/org/snipsnap/snip/Comments.java
@@ -38,6 +38,11 @@ import java.util.List;
 import java.util.Set;
 import java.text.MessageFormat;
 
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpaceFactory;
+
 /**
  * Handler for comments added to snips.
  * @author Stephan J. Schmidt
@@ -46,7 +51,7 @@ import java.text.MessageFormat;
 public class Comments {
   private Snip snip;
   private List comments;
-  private SnipSpace space;
+  private snipsnap.api.snip.SnipSpace space;
   private Set users;
 
   public Comments(Snip snip) {
blob - 38d2454a39424b805866f64f78bf497976536ab3
blob + 2410da361ef4f167b66a45e307f250a1640b93df
--- src/org/snipsnap/snip/Content.java
+++ src/org/snipsnap/snip/Content.java
@@ -31,18 +31,18 @@ import org.picocontainer.PicoContainer;
 import org.radeox.api.engine.RenderEngine;
 import org.radeox.api.engine.context.RenderContext;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
 import org.snipsnap.render.context.SnipRenderContext;
 import org.snipsnap.snip.attachment.Attachment;
 import org.snipsnap.snip.attachment.Attachments;
-import org.snipsnap.snip.label.Labels;
+import snipsnap.api.label.Labels;
 import org.snipsnap.snip.label.RenderEngineLabel;
 import org.snipsnap.snip.name.NameFormatter;
 import org.snipsnap.snip.name.PathRemoveFormatter;
 import org.snipsnap.snip.name.WeblogNameFormatter;
 import org.snipsnap.user.Permissions;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import javax.servlet.http.HttpServletRequest;
 import java.io.BufferedInputStream;
blob - e2899b10c86700d1b395d09f2d88df162cc04a8a
blob + 7f50969f6a71cb05d219e686513654e311b6b5d0
--- src/org/snipsnap/snip/HomePage.java
+++ src/org/snipsnap/snip/HomePage.java
@@ -24,7 +24,11 @@
  */
 package org.snipsnap.snip;
 
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpaceFactory;
 
+
 /**
  * Static class to create a home-page snip.
  * @author Stephan J. Schmidt
@@ -42,7 +46,7 @@ public class HomePage {
     String hp = "\n\n ~~Describe here who you are!~~\n\n__Configure this box!__\n1. Login\n" +
         "1. Click edit to change this snip\n\n" +
         "{snips-by-user:" + login + "}";
-    SnipSpace space = SnipSpaceFactory.getInstance();
+    snipsnap.api.snip.SnipSpace space = SnipSpaceFactory.getInstance();
     if (space.exists(login)) {
       snip = space.load(login);
       snip.setContent(snip.getContent() + hp);
blob - 4dd190a07baabda38916fd03dc49ae601f9c8b9b
blob + b711d7c49a614a79f815c6281dc1150a17cc69f3
--- src/org/snipsnap/snip/Modified.java
+++ src/org/snipsnap/snip/Modified.java
@@ -32,6 +32,9 @@ import org.snipsnap.user.UserManager;
 import java.sql.Timestamp;
 import java.text.MessageFormat;
 
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.SnipLink;
+
 /**
  *  Object with modified information, e.g. for snips
  *  Modified can be pretty printed.
@@ -99,7 +102,7 @@ public class Modified {
     UserManager um = (UserManager) Components.getComponent(UserManager.class);
     return mf.format(new Object[]{
       um.exists(cUser) ? SnipLink.createLink(cUser) : cUser,
-      um.exists(mUser) ? SnipLink.createLink(mUser) : mUser,
+      um.exists(mUser) ? snipsnap.api.snip.SnipLink.createLink(mUser) : mUser,
       getNiceTime(mTime)
     });
   }
blob - 9db286c66ee0a269aa5478d578a850599eb9ae84
blob + a8ae14095f5cf5560f7a0e0d4a927fc0cca140d1
--- src/org/snipsnap/snip/Ownable.java
+++ src/org/snipsnap/snip/Ownable.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.snip;
 
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 /**
  *  Interface for all objects that can be owned
blob - 11e623cdbe21182c15c5c223f31daa27c095aba1
blob + 3a8b487659e96e3e11ff914ce2f0107034e7575b
--- src/org/snipsnap/snip/SnipFactory.java
+++ src/org/snipsnap/snip/SnipFactory.java
@@ -26,6 +26,8 @@
 package org.snipsnap.snip;
 
 import org.snipsnap.interceptor.Aspects;
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.Snip;
 
 
 /**
@@ -40,7 +42,7 @@ public class SnipFactory {
     return new SnipImpl(name, content);
   }
 
-  public static Snip wrap(Snip snip) {
+  public static snipsnap.api.snip.Snip wrap(Snip snip) {
     return (Snip) Aspects.wrap(snip);
   }
 }
blob - cdeef0b3f6e41d30fd529c38712f198df987d10b
blob + 6550d70aedbd86c56e111bbb5c8355c00b352d37
--- src/org/snipsnap/snip/SnipFormatter.java
+++ src/org/snipsnap/snip/SnipFormatter.java
@@ -28,12 +28,16 @@ package org.snipsnap.snip;
 import org.picocontainer.PicoContainer;
 import org.radeox.api.engine.RenderEngine;
 import org.radeox.api.engine.context.RenderContext;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
 import org.snipsnap.render.context.SnipRenderContext;
 
 import java.util.Collection;
 
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+
 /**
  * SnipFormatter supplies some methods for handling Snip Content.
  *
@@ -46,7 +50,7 @@ public class SnipFormatter
 	{
     //@FIXME: This duplicates SnipImpl.toXML()
     RenderEngine engine = (RenderEngine) Components.getComponent(Components.DEFAULT_ENGINE);
-    RenderContext context = new SnipRenderContext(snip, (SnipSpace) Components.getComponent(SnipSpace.class));
+    RenderContext context = new SnipRenderContext(snip, (snipsnap.api.snip.SnipSpace) Components.getComponent(SnipSpace.class));
     context.setParameters(Application.get().getParameters());
     return engine.render(content, context);
   }
blob - 05ddf0c6d7c2c43a4d6fae747607a527f22fe256
blob + fe28eb7feecfbe086455d2452a4f83c1293bb8b3
--- src/org/snipsnap/snip/SnipImpl.java
+++ src/org/snipsnap/snip/SnipImpl.java
@@ -31,17 +31,17 @@ import org.picocontainer.PicoContainer;
 import org.radeox.api.engine.RenderEngine;
 import org.radeox.api.engine.context.RenderContext;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
 import org.snipsnap.render.context.SnipRenderContext;
 import org.snipsnap.snip.attachment.Attachments;
-import org.snipsnap.snip.label.Labels;
+import snipsnap.api.label.Labels;
 import org.snipsnap.snip.label.RenderEngineLabel;
 import org.snipsnap.snip.name.NameFormatter;
 import org.snipsnap.snip.name.PathRemoveFormatter;
 import org.snipsnap.snip.name.WeblogNameFormatter;
 import org.snipsnap.user.Permissions;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import javax.servlet.http.HttpServletRequest;
 // import java.io.File;
@@ -50,6 +50,12 @@ import java.io.Writer;
 import java.sql.Timestamp;
 import java.util.List;
 
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpaceFactory;
+
 /**
  * Central class for snips.
  * <p/>
@@ -76,7 +82,7 @@ public class SnipImpl implements Snip, ProxyAware {
   // @TODO: Composite Object
   private Permissions permissions;
   private Access access;
-  private Labels labels;
+  private snipsnap.api.label.Labels labels;
   private Attachments attachments;
   private Modified modified;
   private int version = 1;
@@ -196,11 +202,11 @@ public class SnipImpl implements Snip, ProxyAware {
     this.attachments = attachments;
   }
 
-  public Labels getLabels() {
+  public snipsnap.api.label.Labels getLabels() {
     return labels;
   }
 
-  public void setLabels(Labels labels) {
+  public void setLabels(snipsnap.api.label.Labels labels) {
     this.labels = labels;
   }
 
@@ -264,7 +270,7 @@ public class SnipImpl implements Snip, ProxyAware {
     return modified.getmUser();
   }
 
-  public void setMUser(User mUser) {
+  public void setMUser(snipsnap.api.user.User mUser) {
     this.modified.setmUser(mUser.getLogin());
   }
 
@@ -518,7 +524,7 @@ public class SnipImpl implements Snip, ProxyAware {
   }
 
   public Snip copy(String newName) {
-    SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
+    snipsnap.api.snip.SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
     Snip newSnip = space.create(newName, getContent());
     newSnip.setLabels(new Labels(newSnip, getLabels().toString()));
     newSnip.setPermissions(getPermissions());
blob - a83ef6c685b7fbfb85f20f183d4bf6c62fbccc6f
blob + 2cef75d42ce542d154e35a0faf46730ce46b2fc6
--- src/org/snipsnap/snip/SnipPath.java
+++ src/org/snipsnap/snip/SnipPath.java
@@ -25,12 +25,16 @@
 
 package org.snipsnap.snip;
 
-import org.snipsnap.config.Configuration;
-import org.snipsnap.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.app.Application;
 
 import java.io.IOException;
 import java.io.Writer;
 
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+
 /**
  * Handle trees of snips with paths.
  *
@@ -46,7 +50,7 @@ public class SnipPath {
   }
 
   //@TODO: make this a object not static, return object from Snip
-  public Writer append(Writer writer, SnipSpace space) {
+  public Writer append(Writer writer, snipsnap.api.snip.SnipSpace space) {
     try {
       Configuration config = Application.get().getConfiguration();
       String name = snip.getName();
@@ -64,7 +68,7 @@ public class SnipPath {
         part = name.substring(lastIndex, index);
         snipName = name.substring(0, index);
         if(space.exists(snipName) ||
-           Application.get().getConfiguration().allow(Configuration.APP_PERM_CREATESNIP)) {
+           Application.get().getConfiguration().allow(snipsnap.api.config.Configuration.APP_PERM_CREATESNIP)) {
           SnipLink.appendLink(writer, snipName, part);
         } else {
           writer.write(part);
blob - cd7a0e3ec2eb244c47980638a7f072a1cd827a96
blob + 578810a6a57fde9213f90125f7cafb98eeb98464
--- src/org/snipsnap/snip/SnipPostNameComparator.java
+++ src/org/snipsnap/snip/SnipPostNameComparator.java
@@ -25,6 +25,9 @@
 
 package org.snipsnap.snip;
 
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.Snip;
+
 import java.util.Comparator;
 
 /**
@@ -45,7 +48,7 @@ public class SnipPostNameComparator implements Compara
   private Comparator comparator = new PostNameComparator();
 
   public int compare(Object o1, Object o2) {
-    if (! (o1 instanceof Snip) || !( o2 instanceof Snip)) {
+    if (! (o1 instanceof Snip) || !( o2 instanceof snipsnap.api.snip.Snip)) {
       throw new ClassCastException();
     }
     Snip snip1 = (Snip) o1;
blob - 1db3f8c446f4969444f984ace22f4935f05e0088
blob + 9bed23e2d8d374c9c90790c04912e7712102d113
--- src/org/snipsnap/snip/SnipSpaceImpl.java
+++ src/org/snipsnap/snip/SnipSpaceImpl.java
@@ -27,7 +27,7 @@ package org.snipsnap.snip;
 
 import org.apache.lucene.search.Hits;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.app.ApplicationManager;
 import org.snipsnap.app.ApplicationStorage;
 import org.snipsnap.container.Components;
@@ -57,6 +57,9 @@ import java.util.Map;
 import java.util.Timer;
 import java.util.TimerTask;
 
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.Snip;
+
 /**
  * SnipSpace implementation handles all the operations with snips like
  * loading, storing, searching etc.
@@ -69,7 +72,7 @@ import java.util.TimerTask;
  * @version $Id$
  */
 
-public class SnipSpaceImpl implements SnipSpace {
+public class SnipSpaceImpl implements snipsnap.api.snip.SnipSpace {
   private ApplicationAwareMap changed;
     // List of snips that are scheduled for storage
   private List delayed;
@@ -166,7 +169,7 @@ public class SnipSpaceImpl implements SnipSpace {
   }
 
   public Blog getBlog() {
-    return getBlog(Application.get().getConfiguration().getStartSnip());
+    return getBlog(snipsnap.api.app.Application.get().getConfiguration().getStartSnip());
   }
 
   // Perhaps add getBlog(Snip)
blob - fd41e447389feb516c60d7b87290903252bf1701
blob + a91ccbd477f8d1b2f1b7ec3cf5c89b9adc05b735
--- src/org/snipsnap/snip/SnipUtil.java
+++ src/org/snipsnap/snip/SnipUtil.java
@@ -25,8 +25,8 @@
 
 package org.snipsnap.snip;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.radeox.util.i18n.ResourceManager;
 
 import java.sql.Date;
@@ -47,7 +47,7 @@ public class SnipUtil {
   }
 
   public static String toDate(String dateString) {
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = Application.get().getConfiguration();
 
     int index = dateString.lastIndexOf('/');
     //@TODO: replace with regex check
blob - a9972f5c2738cd21214efc21ee3268b97119a3d0
blob + 97cac167c869827fc05cc4e50adc5eca89c6dd3f
--- src/org/snipsnap/snip/XMLSnipExport.java
+++ src/org/snipsnap/snip/XMLSnipExport.java
@@ -34,7 +34,7 @@ import org.snipsnap.container.Components;
 import org.snipsnap.jdbc.IntHolder;
 import org.snipsnap.snip.storage.SnipSerializer;
 import org.snipsnap.snip.storage.UserSerializer;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 import org.snipsnap.versioning.VersionInfo;
 import org.snipsnap.versioning.VersionManager;
 
@@ -47,6 +47,9 @@ import java.io.OutputStream;
 import java.util.Iterator;
 import java.util.List;
 
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.Snip;
+
 /**
  * Helper class for exporting Snips and users as XML document.
  * @author Matthias L. Jugel
@@ -100,7 +103,7 @@ public class XMLSnipExport {
 
       Iterator snipListIterator = snips.iterator();
       while (snipListIterator.hasNext()) {
-        Snip snip = (Snip) snipListIterator.next();
+        snipsnap.api.snip.Snip snip = (Snip) snipListIterator.next();
         if (filter == null || !snip.getName().matches(filter)) {
           Element snipEl = snipSerializer.serialize(snip);
           if (null != ignoreElements) {
blob - 9721fe26282d2d640adca154ffbcab55d0a5301b
blob + b81f1bffe6cde87f25951a5bf6ebbdae8e294094
--- src/org/snipsnap/snip/XMLSnipImport.java
+++ src/org/snipsnap/snip/XMLSnipImport.java
@@ -32,13 +32,13 @@ import org.dom4j.ElementHandler;
 import org.dom4j.ElementPath;
 import org.dom4j.io.SAXReader;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.container.Components;
 import org.snipsnap.jdbc.IntHolder;
 import org.snipsnap.snip.storage.SnipSerializer;
 import org.snipsnap.snip.storage.UserSerializer;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 import org.snipsnap.user.UserManager;
 import org.snipsnap.versioning.VersionManager;
 
@@ -54,6 +54,10 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import snipsnap.api.snip.*;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+
 /**
  * Helper class for importing serialized database backups.
  * @author Matthias L. Jugel
@@ -180,7 +184,7 @@ public class XMLSnipImport {
     String email = (String) userMap.get(UserSerializer.USER_EMAIL);
 
     UserManager userManager = (UserManager) Components.getComponent(UserManager.class);
-    User user = null;
+    snipsnap.api.user.User user = null;
     if (userManager.exists(login)) {
       if ((flags & OVERWRITE) == 0) {
         Logger.log("ignoring to import user '" + login + "'");
@@ -204,7 +208,7 @@ public class XMLSnipImport {
     String name = (String) snipMap.get(SnipSerializer.SNIP_NAME);
     String content = (String) snipMap.get(SnipSerializer.SNIP_CONTENT);
 
-    SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
+    SnipSpace space = (snipsnap.api.snip.SnipSpace) Components.getComponent(SnipSpace.class);
     Snip snip = null;
     if (space.exists(name)) {
       Logger.log("loading existing snip '" + name + "'");
@@ -219,7 +223,7 @@ public class XMLSnipImport {
     }
 
     UserManager um = (UserManager) Components.getComponent(UserManager.class);
-    User importUser = Application.get().getUser();
+    snipsnap.api.user.User importUser = snipsnap.api.app.Application.get().getUser();
 
     // check existing users
     if (!um.exists((String) snipMap.get(SnipSerializer.SNIP_CUSER))) {
@@ -239,7 +243,7 @@ public class XMLSnipImport {
     snip.getBackLinks().getSize();
     // ensure that the configuration snip is stored normally
     // so the configuration is updated
-    if (Configuration.SNIPSNAP_CONFIG.equals(snip.getName())) {
+    if (snipsnap.api.config.Configuration.SNIPSNAP_CONFIG.equals(snip.getName())) {
       space.store(snip);
     } else {
       space.systemStore(snip);
@@ -247,7 +251,7 @@ public class XMLSnipImport {
   }
 
   private static void restoreAttachments(Element snipEl) {
-    Configuration config = Application.get().getConfiguration();
+    Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     File attRoot = config.getFilePath();
     Element attachmentsEl = snipEl.element("attachments");
     if (null != attachmentsEl) {
blob - a93a099e87aca2ff2c8383cfa5af98edf592b9df
blob + 88dfc993a052d392fd8eaad84584a693e914f33c
--- src/org/snipsnap/snip/attachment/Attachment.java
+++ src/org/snipsnap/snip/attachment/Attachment.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.snip.attachment;
 
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.snip.SnipLink;
 
 import java.util.Date;
 
blob - 884c36f91dd484869f8fafdd464ffcb08f908d43
blob + ee2704267418981ff47b7c338e772f96f3ac3f20
--- src/org/snipsnap/snip/attachment/Attachments.java
+++ src/org/snipsnap/snip/attachment/Attachments.java
@@ -32,10 +32,10 @@ import org.dom4j.io.OutputFormat;
 import org.dom4j.io.SAXReader;
 import org.dom4j.io.XMLWriter;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
 import org.snipsnap.snip.attachment.storage.AttachmentStorage;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.snip.SnipLink;
 
 import java.io.*;
 import java.util.ArrayList;
@@ -222,7 +222,7 @@ public class Attachments {
     while (it.hasNext()) {
       Attachment att = (Attachment) it.next();
       if (storage.exists(att)) {
-        tmp.append(SnipLink.createLink(SnipLink.getSpaceRoot() + "/" + SnipLink.encode(name), att.getName(), att.getName()));
+        tmp.append(snipsnap.api.snip.SnipLink.createLink(SnipLink.getSpaceRoot() + "/" + snipsnap.api.snip.SnipLink.encode(name), att.getName(), att.getName()));
         tmp.append(" (").append(att.getSize()).append(")");
         if (it.hasNext()) {
           tmp.append("<br/> ");
blob - 5ca7f0655365b99ca00f392521e3ce4ff2e707f8
blob + 5a9b72953585962fa5abc742bf326618373df5d0
--- src/org/snipsnap/snip/attachment/storage/FileAttachmentStorage.java
+++ src/org/snipsnap/snip/attachment/storage/FileAttachmentStorage.java
@@ -26,8 +26,8 @@
 package org.snipsnap.snip.attachment.storage;
 
 import org.snipsnap.snip.attachment.Attachment;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.app.Application;
 import org.radeox.util.logging.Logger;
 
 import java.io.*;
blob - f9b82dbfd0f96232bc742b808551e1cf455ed4c7
blob + 63611aa45f4860f29cf825e8a398c688ae8f7393
--- src/org/snipsnap/snip/label/BaseLabel.java
+++ src/org/snipsnap/snip/label/BaseLabel.java
@@ -27,8 +27,9 @@ package org.snipsnap.snip.label;
 
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.serialization.LabelContext;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.label.*;
+import snipsnap.api.label.LabelContext;
 
 import java.util.Map;
 
@@ -39,10 +40,10 @@ import java.util.Map;
  * @version $Id$
  */
 
-public abstract class BaseLabel implements Label {
+public abstract class BaseLabel implements snipsnap.api.label.Label {
   protected String name;
   protected String value;
-  protected Snip snip;
+  protected snipsnap.api.snip.Snip snip;
 
   public BaseLabel() {
     name = "";
@@ -54,11 +55,11 @@ public abstract class BaseLabel implements Label {
     this.value = value;
   }
 
-  public void setSnip(Snip snip) {
+  public void setSnip(snipsnap.api.snip.Snip snip) {
     this.snip = snip;
   }
 
-  public Snip getSnip() {
+  public snipsnap.api.snip.Snip getSnip() {
     return snip;
   }
 
blob - 358e8d0d3c49ebe57c6c8887c0ab75b3db4e7500
blob + 83d429344564dc8358ac1ca129b7539aff81864f
--- src/org/snipsnap/snip/label/BooleanLabel.java
+++ src/org/snipsnap/snip/label/BooleanLabel.java
@@ -27,8 +27,9 @@ package org.snipsnap.snip.label;
 
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.serialization.LabelContext;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.label.*;
+import snipsnap.api.label.LabelContext;
 
 import java.util.Map;
 
@@ -39,7 +40,7 @@ import java.util.Map;
  * @version $Id$
  */
 
-public class BooleanLabel implements Label {
+public class BooleanLabel implements snipsnap.api.label.Label {
   protected String name;
   protected String value;
   protected Snip snip;
@@ -68,11 +69,11 @@ public class BooleanLabel implements Label {
     return new LabelContext(snip, this);
   }
 
-  public void setSnip(Snip snip) {
+  public void setSnip(snipsnap.api.snip.Snip snip) {
     this.snip = snip;
   }
 
-  public Snip getSnip() {
+  public snipsnap.api.snip.Snip getSnip() {
     return snip;
   }
 
blob - ed11a04adea082cdb43cb6a8cfe006929ffb3e69
blob + 1930cb1670264807eacbf8e0cf601055a935a6e3
--- src/org/snipsnap/snip/label/CategoryLabel.java
+++ src/org/snipsnap/snip/label/CategoryLabel.java
@@ -29,15 +29,15 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.snip.label.BaseLabel;
-import org.snipsnap.snip.label.Label;
-import org.snipsnap.snip.label.Labels;
+import snipsnap.api.label.Label;
+import snipsnap.api.label.Labels;
 import org.snipsnap.user.AuthenticationService;
 import org.snipsnap.util.URLEncoderDecoder;
 
@@ -77,7 +77,7 @@ public class CategoryLabel extends BaseLabel {
    */
   public String getInputProxy() {
     StringBuffer buffer = new StringBuffer();
-    SnipSpace snipspace = (SnipSpace) Components.getComponent(SnipSpace.class);
+    snipsnap.api.snip.SnipSpace snipspace = (SnipSpace) Components.getComponent(SnipSpace.class);
     List snipList = snipspace.getAll();
 
     buffer.append("Category: ");
@@ -96,7 +96,7 @@ public class CategoryLabel extends BaseLabel {
           Iterator iter = LabelsCat.iterator();
           while (iter.hasNext()) {
 // We only want snips with a label Type:Category
-            Label label = (Label) iter.next();
+            Label label = (snipsnap.api.label.Label) iter.next();
             if (label.getValue().equals("Category")) {
               String category = snip.getName();
               buffer.append("<option>");
@@ -132,7 +132,7 @@ public class CategoryLabel extends BaseLabel {
       String[] strings = name.split("/");
       String string = strings[strings.length - 1];
       SnipLink.appendLink(buffer, name, string);
-    } else if (!service.isAuthenticated(Application.get().getUser())) {
+    } else if (!service.isAuthenticated(snipsnap.api.app.Application.get().getUser())) {
       buffer.append(name);
     } else {
       SnipLink.appendCreateLink(buffer, name);
blob - 07a1032269ca4b73ecd685df275a8ddf8cbeb715
blob + fd8424cc1c644f2f36e99cc304cb524b4bdfd52e
--- src/org/snipsnap/snip/label/LabelManager.java
+++ src/org/snipsnap/snip/label/LabelManager.java
@@ -34,6 +34,9 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 
+import snipsnap.api.label.*;
+import snipsnap.api.label.Label;
+
 /**
  * Manages the creation and finding of labels, e.g. by type.
  * Delivers a plugin structure to easily add labels.
@@ -44,7 +47,7 @@ public class LabelManager {
   private Map typeMap;
   private String defaultName;
   private static LabelManager instance = null;
-  private static String labelClassName = "org.snipsnap.snip.label.Label";
+  private static String labelClassName = "snipsnap.api.label.Label";
 
   public LabelManager() {
     typeMap = new HashMap();
@@ -97,7 +100,7 @@ public class LabelManager {
     return label;
   }
 
-  public Label getDefaultLabel() {
+  public snipsnap.api.label.Label getDefaultLabel() {
     return getLabel(defaultName);
   }
 
blob - 0308d6dcf6c7eef3e0f013a8fc31d9f97c0e907b
blob + 0e18d9465a936079549b28d61994a8c7e9d20efa
--- src/org/snipsnap/snip/label/RenderEngineLabel.java
+++ src/org/snipsnap/snip/label/RenderEngineLabel.java
@@ -28,8 +28,9 @@ package org.snipsnap.snip.label;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.serialization.LabelContext;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.label.*;
+import snipsnap.api.label.LabelContext;
 import org.radeox.api.engine.RenderEngine;
 
 import java.util.Map;
@@ -42,7 +43,7 @@ import java.util.Map;
  * @version $Id$
  */
 
-public class RenderEngineLabel implements Label {
+public class RenderEngineLabel implements snipsnap.api.label.Label {
   protected String name;
   protected String engine;
   protected Snip snip;
@@ -65,11 +66,11 @@ public class RenderEngineLabel implements Label {
     return new LabelContext(snip, this);
   }
 
-  public void setSnip(Snip snip) {
+  public void setSnip(snipsnap.api.snip.Snip snip) {
     this.snip = snip;
   }
 
-  public Snip getSnip() {
+  public snipsnap.api.snip.Snip getSnip() {
     return snip;
   }
 
blob - c341e106ad161274ffd731edcc1b267af2bf4e35
blob + 649552ede25a4888389d7058922c05cd409c2766
--- src/org/snipsnap/snip/label/SnipLabel.java
+++ src/org/snipsnap/snip/label/SnipLabel.java
@@ -25,10 +25,10 @@
 
 package org.snipsnap.snip.label;
 
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.user.AuthenticationService;
 
 /**
@@ -91,11 +91,11 @@ public class SnipLabel extends BaseLabel {
     AuthenticationService service = (AuthenticationService) Components.getComponent(AuthenticationService.class);
 
     if (SnipSpaceFactory.getInstance().exists(name)) {
-      SnipLink.appendLink(buffer, name, name);
+      snipsnap.api.snip.SnipLink.appendLink(buffer, name, name);
     } else if (!service.isAuthenticated(Application.get().getUser())) {
       buffer.append(name);
     } else {
-      SnipLink.appendCreateLink(buffer, name);
+      snipsnap.api.snip.SnipLink.appendCreateLink(buffer, name);
     }
     return buffer;
   }
blob - 42cd8918d0fbf5d08be976208de4cd24c07d00cf
blob + 00c64a122192ecd59299139c712580772e74f296
--- src/org/snipsnap/snip/label/TaxonomyLabel.java
+++ src/org/snipsnap/snip/label/TaxonomyLabel.java
@@ -29,15 +29,15 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.snip.label.BaseLabel;
-import org.snipsnap.snip.label.Label;
-import org.snipsnap.snip.label.Labels;
+import snipsnap.api.label.Label;
+import snipsnap.api.label.Labels;
 import org.snipsnap.user.AuthenticationService;
 
 /**
@@ -74,7 +74,7 @@ public class TaxonomyLabel extends BaseLabel {
    */
   public String getInputProxy() {
     StringBuffer buffer = new StringBuffer();
-    SnipSpace snipspace = (SnipSpace) Components.getComponent(SnipSpace.class);
+    snipsnap.api.snip.SnipSpace snipspace = (SnipSpace) Components.getComponent(snipsnap.api.snip.SnipSpace.class);
     List snipList = snipspace.getAll();
 
     buffer.append("Taxonomy: ");
@@ -83,8 +83,8 @@ public class TaxonomyLabel extends BaseLabel {
     Iterator iterator = snipList.iterator();
     buffer.append("<select name=\"label.value\" size=\"1\">");
     while (iterator.hasNext()) {
-      Snip snip = (Snip) iterator.next();
-      Labels labels = snip.getLabels();
+      Snip snip = (snipsnap.api.snip.Snip) iterator.next();
+      snipsnap.api.label.Labels labels = snip.getLabels();
       boolean noLabelsAll = labels.getAll().isEmpty();
       if (!noLabelsAll) {
         Collection LabelsCat;
@@ -92,7 +92,7 @@ public class TaxonomyLabel extends BaseLabel {
         if (!LabelsCat.isEmpty()) {
           Iterator iter = LabelsCat.iterator();
           while (iter.hasNext()) {
-            Label label = (Label) iter.next();
+            snipsnap.api.label.Label label = (snipsnap.api.label.Label) iter.next();
             if (label.getValue().equals("Category")) {
               String category = snip.getName();
               buffer.append("<option>");
@@ -121,9 +121,9 @@ public class TaxonomyLabel extends BaseLabel {
   private StringBuffer getSnipLink(StringBuffer buffer, String name) {
     AuthenticationService service = (AuthenticationService) Components.getComponent(AuthenticationService.class);
 
-    if (SnipSpaceFactory.getInstance().exists(name)) {
-      SnipLink.appendLink(buffer, name, name);
-    } else if (!service.isAuthenticated(Application.get().getUser())) {
+    if (snipsnap.api.snip.SnipSpaceFactory.getInstance().exists(name)) {
+      snipsnap.api.snip.SnipLink.appendLink(buffer, name, name);
+    } else if (!service.isAuthenticated(snipsnap.api.app.Application.get().getUser())) {
       buffer.append(name);
     } else {
       SnipLink.appendCreateLink(buffer, name);
blob - 8333cb95b6f91395770957f3f96e4f6affec17d8
blob + 50dfb9cbf126947b1a2cd122c463a61bd46a861b
--- src/org/snipsnap/snip/label/TypeLabel.java
+++ src/org/snipsnap/snip/label/TypeLabel.java
@@ -26,7 +26,7 @@ package org.snipsnap.snip.label;
 
 import org.radeox.util.Service;
 import org.radeox.util.i18n.ResourceManager;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.net.ServletPluginLoader;
 
 import java.util.HashMap;
@@ -158,7 +158,7 @@ public class TypeLabel extends BaseLabel {
 
   public String getInputProxy() {
     StringBuffer buffer = new StringBuffer();
-    if (Application.get().getUser().isAdmin()) {
+    if (snipsnap.api.app.Application.get().getUser().isAdmin()) {
       buffer.append("<input type=\"hidden\" name=\"label.name\" value=\"");
       buffer.append(name);
       buffer.append("\"/>");
@@ -254,7 +254,7 @@ public class TypeLabel extends BaseLabel {
 
   public void handleInput(Map input) {
     // ADMIN ONLY!
-    if (Application.get().getUser().isAdmin()) {
+    if (snipsnap.api.app.Application.get().getUser().isAdmin()) {
       super.handleInput(input);
       if (input.containsKey("label.type")) {
         type = (String) input.get("label.type");
blob - c1c6ebb03c01d7b0e9cd754303bead2694cf9985
blob + c00defa04d89100c3b9d0eee2e503f213fb86743
--- src/org/snipsnap/snip/storage/CacheSnipStorage.java
+++ src/org/snipsnap/snip/storage/CacheSnipStorage.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.snip.storage;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.util.ApplicationAwareMap;
 
 import java.sql.Timestamp;
@@ -58,10 +58,10 @@ public class CacheSnipStorage implements SnipStorage, 
   }
 
   // Basic manipulation methods Load,Store,Create,Remove
-  public Snip storageLoad(String name) {
+  public snipsnap.api.snip.Snip storageLoad(String name) {
     Snip snip;
     if (cache.getMap().containsKey(name)) {
-      snip = (Snip) cache.getMap().get(name);
+      snip = (snipsnap.api.snip.Snip) cache.getMap().get(name);
     } else {
       snip = storage.storageLoad(name);
       cache.getMap().put(snip.getName(), snip);
@@ -133,11 +133,11 @@ public class CacheSnipStorage implements SnipStorage, 
     return storage.storageByParent(parent);
   }
 
-  public List storageByParentNameOrder(Snip parent, int count) {
+  public List storageByParentNameOrder(snipsnap.api.snip.Snip parent, int count) {
     return storage.storageByParentNameOrder(parent, count);
   }
 
-  public List storageByParentModifiedOrder(Snip parent, int count) {
+  public List storageByParentModifiedOrder(snipsnap.api.snip.Snip parent, int count) {
     return storage.storageByParentModifiedOrder(parent, count);
   }
 
blob - 7b2ffee371a322e75e3ad97670ad2a18d0cc6d61
blob + 0c9f05abafe32ad97fe9f68c1c7c010d90aaa720
--- src/org/snipsnap/snip/storage/FileSnipStorage.java
+++ src/org/snipsnap/snip/storage/FileSnipStorage.java
@@ -26,13 +26,13 @@
 package org.snipsnap.snip.storage;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.interceptor.Aspects;
 import org.snipsnap.snip.Links;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.SnipFactory;
 import org.snipsnap.snip.attachment.Attachments;
-import org.snipsnap.snip.label.Labels;
+import snipsnap.api.label.Labels;
 import org.snipsnap.user.Permissions;
 import org.snipsnap.util.ApplicationAwareMap;
 import org.snipsnap.versioning.VersionInfo;
@@ -254,7 +254,7 @@ public abstract class FileSnipStorage implements Cache
    * @param snip Snip to store
    * @param snipDir Directory to store the snip in
    */
-  protected abstract void storeSnip(Snip snip, File snipDir);
+  protected abstract void storeSnip(snipsnap.api.snip.Snip snip, File snipDir);
 
   public void storageStore(List snips) {
     Iterator iterator = snips.iterator();
@@ -271,13 +271,13 @@ public abstract class FileSnipStorage implements Cache
    *
    * @param snip Snip to store
    */
-  public void storageStore(Snip snip) {
+  public void storageStore(snipsnap.api.snip.Snip snip) {
     File snipDir = new File(getWorkingDir(), snip.getName());
     storeSnip(snip, snipDir);
   }
 
   public Snip storageCreate(String name, String content) {
-    Application app = Application.get();
+    snipsnap.api.app.Application app = Application.get();
     String applicationOid = (String) app.getObject(Application.OID);
     String login = app.getUser().getLogin();
 
@@ -292,14 +292,14 @@ public abstract class FileSnipStorage implements Cache
     snip.setPermissions(new Permissions());
     snip.setBackLinks(new Links());
     snip.setSnipLinks(new Links());
-    snip.setLabels(new Labels());
+    snip.setLabels(new snipsnap.api.label.Labels());
     snip.setAttachments(new Attachments());
     snip.setApplication(applicationOid);
     storageStore(snip);
     return SnipFactory.wrap(snip);
   }
 
-  private Snip parseSnip(Map snipMap) {
+  private snipsnap.api.snip.Snip parseSnip(Map snipMap) {
     // the application oid is a special for file snip storage
     String applicationOid = (String) snipMap.get(SnipSerializer.SNIP_APPLICATION);
     String name = (String) snipMap.get(SnipSerializer.SNIP_NAME);
@@ -307,19 +307,19 @@ public abstract class FileSnipStorage implements Cache
       return (Snip) cache.getMap(applicationOid).get(name.toUpperCase());
     }
 
-    Snip newSnip = SnipFactory.createSnip(name, (String) snipMap.get(SnipSerializer.SNIP_CONTENT));
+    snipsnap.api.snip.Snip newSnip = SnipFactory.createSnip(name, (String) snipMap.get(SnipSerializer.SNIP_CONTENT));
     Snip snip = serializer.deserialize(snipMap, newSnip);
 
     // Aspects.setTarget(proxy, snip);
     // return proxy;
-    snip = (Snip) Aspects.wrap(snip);
+    snip = (snipsnap.api.snip.Snip) Aspects.wrap(snip);
     cache.getMap(applicationOid).put(name.toUpperCase(), snip);
     return snip;
   }
 
   // SnipStorage
   public List storageAll() {
-    String applicationOid = (String) Application.get().getObject(Application.OID);
+    String applicationOid = (String) Application.get().getObject(snipsnap.api.app.Application.OID);
     return storageAll(applicationOid);
   }
 
@@ -403,7 +403,7 @@ public abstract class FileSnipStorage implements Cache
     throw new MethodNotSupportedException(NOT_SUPPORTED_EXCEPTION_MSG);
   }
 
-  public List storageByParentNameOrder(Snip parent, int count) {
+  public List storageByParentNameOrder(snipsnap.api.snip.Snip parent, int count) {
     throw new MethodNotSupportedException(NOT_SUPPORTED_EXCEPTION_MSG);
   }
 
@@ -419,7 +419,7 @@ public abstract class FileSnipStorage implements Cache
     throw new MethodNotSupportedException(NOT_SUPPORTED_EXCEPTION_MSG);
   }
 
-  public Snip[] match(String start, String end) {
+  public snipsnap.api.snip.Snip[] match(String start, String end) {
     throw new MethodNotSupportedException(NOT_SUPPORTED_EXCEPTION_MSG);
   }
 
blob - 6a9823e8ff50ddec7fa303c1a78215338fa2f908
blob + 897105320dbf439bbc37deb262e3539787f754bd
--- src/org/snipsnap/snip/storage/FileUserStorage.java
+++ src/org/snipsnap/snip/storage/FileUserStorage.java
@@ -26,8 +26,8 @@
 package org.snipsnap.snip.storage;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.user.User;
+import snipsnap.api.app.Application;
+import snipsnap.api.user.User;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -138,7 +138,7 @@ public abstract class FileUserStorage implements UserS
     }
     File userFile = new File(userDir, getFileName(login));
 
-    User user = new User(login, passwd, email);
+    User user = new snipsnap.api.user.User(login, passwd, email);
     String applicationOid = (String) Application.get().getObject(Application.OID);
     Timestamp cTime = new Timestamp(new java.util.Date().getTime());
     user.setCTime(cTime);
@@ -160,7 +160,7 @@ public abstract class FileUserStorage implements UserS
    *
    * @param user User to remove
    */
-  public void storageRemove(User user) {
+  public void storageRemove(snipsnap.api.user.User user) {
     removeUser(user, getWorkingDir());
   }
 
@@ -170,7 +170,7 @@ public abstract class FileUserStorage implements UserS
    * @param user User to remove
    * @param userDir Directory which contains the user data
    */
-  protected void removeUser(User user, File userDir) {
+  protected void removeUser(snipsnap.api.user.User user, File userDir) {
     File userFile = new File(userDir, getFileName(user.getLogin()));
     if (userFile.exists()) {
       File backup = new File(userFile.getPath() + ".removed");
blob - cd5da1fa43aaf9c878ebe867223655a93ed5fa0a
blob + 4ffa9000d3dde8b05e2ce70515badcf83cea318a
--- src/org/snipsnap/snip/storage/MemorySnipStorage.java
+++ src/org/snipsnap/snip/storage/MemorySnipStorage.java
@@ -25,10 +25,10 @@
 
 package org.snipsnap.snip.storage;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.util.PartialSearcher;
 import org.snipsnap.util.ApplicationAwareMap;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.app.ApplicationManager;
 import org.snipsnap.app.ApplicationStorage;
 
@@ -94,12 +94,12 @@ public class MemorySnipStorage implements SnipStorage 
     return ((PartialSearcher) cache.getMap()).match(pattern.toUpperCase());
   }
 
-  public Snip[] match(String start, String end) {
+  public snipsnap.api.snip.Snip[] match(String start, String end) {
     return ((PartialSearcher) cache.getMap()).match(start.toUpperCase(), end.toUpperCase());
   }
 
   public Snip storageLoad(String name) {
-    return (Snip) cache.getMap().get(name.toUpperCase());
+    return (snipsnap.api.snip.Snip) cache.getMap().get(name.toUpperCase());
   }
 
   public Object loadObject(String name) {
@@ -114,7 +114,7 @@ public class MemorySnipStorage implements SnipStorage 
     storage.storageStore(snip);
   }
 
-  public Snip storageCreate(String name, String content) {
+  public snipsnap.api.snip.Snip storageCreate(String name, String content) {
     Snip snip = storage.storageCreate(name, content);
 
     // TODO fix this, the allList is not necessarily correctly initialized!
@@ -130,7 +130,7 @@ public class MemorySnipStorage implements SnipStorage 
     return snip;
   }
 
-  public void storageRemove(Snip snip) {
+  public void storageRemove(snipsnap.api.snip.Snip snip) {
     String applicationOid = snip.getApplication();
     storage.storageRemove(snip);
     List allSnips = (List) allList.get(applicationOid);
@@ -143,7 +143,7 @@ public class MemorySnipStorage implements SnipStorage 
   }
 
   public int storageCount() {
-    String application = (String) Application.get().getObject(Application.OID);
+    String application = (String) snipsnap.api.app.Application.get().getObject(snipsnap.api.app.Application.OID);
     List allSnips = (List) allList.get(application);
     return allSnips != null ? allSnips.size() : 0;
   }
@@ -154,7 +154,7 @@ public class MemorySnipStorage implements SnipStorage 
   }
 
   public List storageAll() {
-    String applicationOid = (String) Application.get().getObject(Application.OID);
+    String applicationOid = (String) Application.get().getObject(snipsnap.api.app.Application.OID);
     return storageAll(applicationOid);
   }
 
@@ -185,7 +185,7 @@ public class MemorySnipStorage implements SnipStorage 
     throw new MethodNotSupportedException(NOT_SUPPORTED_EXCEPTION_MSG);
   }
 
-  public List storageByComments(Snip parent) {
+  public List storageByComments(snipsnap.api.snip.Snip parent) {
     throw new MethodNotSupportedException(NOT_SUPPORTED_EXCEPTION_MSG);
   }
 
@@ -193,7 +193,7 @@ public class MemorySnipStorage implements SnipStorage 
     throw new MethodNotSupportedException(NOT_SUPPORTED_EXCEPTION_MSG);
   }
 
-  public List storageByParentNameOrder(Snip parent, int count) {
+  public List storageByParentNameOrder(snipsnap.api.snip.Snip parent, int count) {
     throw new MethodNotSupportedException(NOT_SUPPORTED_EXCEPTION_MSG);
   }
 
blob - 36d17b0fd2f5d1a71d713a9ebf4f6ea585d6b6f5
blob + 60e23982587f34f3cc54b9b6d048ed374354686f
--- src/org/snipsnap/snip/storage/OneFileSnipStorage.java
+++ src/org/snipsnap/snip/storage/OneFileSnipStorage.java
@@ -26,7 +26,7 @@
 package org.snipsnap.snip.storage;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 import java.io.*;
 import java.util.Map;
blob - e6760cf773e32be58e4159c68a25600ac0ed0cdb
blob + f5409493b1a40edb35422f93fd00147c3e8503c1
--- src/org/snipsnap/snip/storage/PropertyFileSnipStorage.java
+++ src/org/snipsnap/snip/storage/PropertyFileSnipStorage.java
@@ -26,8 +26,8 @@
 package org.snipsnap.snip.storage;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.app.Application;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.app.Application;
 
 import java.io.*;
 import java.util.Map;
@@ -76,7 +76,7 @@ public class PropertyFileSnipStorage extends TwoFileSn
    * @param snip
    * @param out
    */
-  protected void storeContent(Snip snip, OutputStream out) {
+  protected void storeContent(snipsnap.api.snip.Snip snip, OutputStream out) {
     PrintWriter snipWriter = null;
     try {
       String enc = Application.get().getConfiguration().getEncoding();
@@ -98,7 +98,7 @@ public class PropertyFileSnipStorage extends TwoFileSn
    * @param snip
    * @param out
    */
-  protected void storeMetadata(Snip snip, OutputStream out) {
+  protected void storeMetadata(snipsnap.api.snip.Snip snip, OutputStream out) {
     // serialize snip, remove content and add application oid
     Properties snipProps = new Properties();
     SnipSerializer serializer = SnipSerializer.getInstance();
blob - 582751c37b3a7f4bf382c30eb504968b5417f6d6
blob + f526f8ca9478f198a06cb50ca7199acc67e27222
--- src/org/snipsnap/snip/storage/PropertyFileUserStorage.java
+++ src/org/snipsnap/snip/storage/PropertyFileUserStorage.java
@@ -26,7 +26,7 @@
 package org.snipsnap.snip.storage;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -93,7 +93,7 @@ public class PropertyFileUserStorage extends FileUserS
       String fileName = files[i];
       String login = fileName.substring(0, fileName.lastIndexOf("."));
       try {
-        User user = parseUser(loadUser(login, new FileInputStream(new File(userDir, fileName))));
+        snipsnap.api.user.User user = parseUser(loadUser(login, new FileInputStream(new File(userDir, fileName))));
         users.add(user);
       } catch (Exception e) {
         Logger.log("PropertyFileUserStorage: cannot load user "+fileName, e);
blob - 8c2bc1676ca711088d74e30b23d65f0956eb33d4
blob + 2e8f0fad536435b43beae93b842f805c4234e1a3
--- src/org/snipsnap/snip/storage/QuerySnipStorage.java
+++ src/org/snipsnap/snip/storage/QuerySnipStorage.java
@@ -25,8 +25,8 @@
 
 package org.snipsnap.snip.storage;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.app.Application;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.SnipPostNameComparator;
 import org.snipsnap.snip.storage.query.QueryKit;
 import org.snipsnap.snip.storage.query.SnipComparator;
@@ -52,7 +52,7 @@ public class QuerySnipStorage implements SnipStorage {
   // Count comparators, make the comparator by default
   // with most usages. Make this dynamic
   private static Comparator nameComparator = new SnipComparator() {
-    public int compare(Snip s1, Snip s2) {
+    public int compare(snipsnap.api.snip.Snip s1, Snip s2) {
       return s1.getName().compareTo(s2.getName());
     }
   };
@@ -60,7 +60,7 @@ public class QuerySnipStorage implements SnipStorage {
   private static Comparator snipPostNameComparator = new SnipPostNameComparator();
 
   private static Comparator nameWithoutPathComparator = new SnipComparator() {
-    public int compare(Snip s1, Snip s2) {
+    public int compare(Snip s1, snipsnap.api.snip.Snip s2) {
       return getName(s1).compareTo(getName(s2));
     }
 
@@ -76,12 +76,12 @@ public class QuerySnipStorage implements SnipStorage {
   };
 
   private static Comparator nameComparatorDesc = new SnipComparator() {
-    public int compare(Snip s1, Snip s2) {
+    public int compare(Snip s1, snipsnap.api.snip.Snip s2) {
       return s2.getName().compareTo(s1.getName());
     }
   };
   private static Comparator mTimeComparatorDesc = new SnipComparator() {
-    public int compare(Snip s1, Snip s2) {
+    public int compare(Snip s1, snipsnap.api.snip.Snip s2) {
       return s2.getMTime().compareTo(s1.getMTime());
     }
   };
@@ -129,7 +129,7 @@ public class QuerySnipStorage implements SnipStorage {
     return storage.storageCreate(name, content);
   }
 
-  public void storageRemove(Snip snip) {
+  public void storageRemove(snipsnap.api.snip.Snip snip) {
     storage.storageRemove(snip);
   }
 
blob - dec219d23cb9d98778acb8787a513f5a1a58e6cb
blob + ec27634aa7f96a8c8aee463323e6d974e2f3ece1
--- src/org/snipsnap/snip/storage/SnipSerializer.java
+++ src/org/snipsnap/snip/storage/SnipSerializer.java
@@ -28,9 +28,9 @@ package org.snipsnap.snip.storage;
 import org.dom4j.Element;
 import org.radeox.util.logging.Logger;
 import org.snipsnap.snip.Links;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.attachment.Attachments;
-import org.snipsnap.snip.label.Labels;
+import snipsnap.api.label.Labels;
 import org.snipsnap.user.Permissions;
 
 import java.sql.Timestamp;
@@ -67,7 +67,7 @@ public class SnipSerializer extends SnipDataSerializer
    * @param snip the snip to store
    * @return the serialized snip as XML
    */
-  public Element serialize(Snip snip) {
+  public Element serialize(snipsnap.api.snip.Snip snip) {
     return serialize(createSnipMap(snip));
   }
 
@@ -81,7 +81,7 @@ public class SnipSerializer extends SnipDataSerializer
     return deserialize(snipMap, snip);
   }
 
-  public Snip deserialize(Map snipMap, Snip snip) {
+  public Snip deserialize(Map snipMap, snipsnap.api.snip.Snip snip) {
 //    System.out.println("deserializing: "+snipMap.get(SNIP_NAME));
     Iterator elementIt = snipMap.keySet().iterator();
     while (elementIt.hasNext()) {
@@ -147,7 +147,7 @@ public class SnipSerializer extends SnipDataSerializer
     return snip;
   }
 
-  public Map createSnipMap(Snip snip) {
+  public Map createSnipMap(snipsnap.api.snip.Snip snip) {
     Map snipMap = new HashMap();
     snipMap.put(SNIP_NAME, notNull(snip.getName()));
     snipMap.put(SNIP_OUSER, notNull(snip.getOUser()));
@@ -168,7 +168,7 @@ public class SnipSerializer extends SnipDataSerializer
     // TODO deprecated
     Snip parent = snip.getParent();
     snipMap.put(SNIP_PARENT, null == parent ? "" : parent.getName());
-    Snip comment = snip.getCommentedSnip();
+    snipsnap.api.snip.Snip comment = snip.getCommentedSnip();
     snipMap.put(SNIP_COMMENTED, null == comment ? "" : comment.getName());
     return snipMap;
   }
blob - 2f010264be489b63aca4ae737da5a63baed66193
blob + d17afeca85d5378e0e40a3d1437de3227a0bdb26
--- src/org/snipsnap/snip/storage/SnipStorage.java
+++ src/org/snipsnap/snip/storage/SnipStorage.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.snip.storage;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 import java.sql.Timestamp;
 import java.util.List;
blob - 525be8b0cddf535b9e7485a938ff7e9ba017608e
blob + c6bea945a11c9bc45ec1519a69084d6f6e3a50d9
--- src/org/snipsnap/snip/storage/TwoFileSnipStorage.java
+++ src/org/snipsnap/snip/storage/TwoFileSnipStorage.java
@@ -26,7 +26,7 @@
 package org.snipsnap.snip.storage;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.versioning.VersionInfo;
 
 import java.io.*;
@@ -94,7 +94,7 @@ public abstract class TwoFileSnipStorage extends FileS
    * @param out
    */
 
-  protected abstract void storeContent(Snip snip, OutputStream out);
+  protected abstract void storeContent(snipsnap.api.snip.Snip snip, OutputStream out);
 
   /**
    * Store the metadata of a snip to
@@ -105,7 +105,7 @@ public abstract class TwoFileSnipStorage extends FileS
    * @param snip
    * @param out
    */
-  protected abstract void storeMetadata(Snip snip, OutputStream out);
+  protected abstract void storeMetadata(snipsnap.api.snip.Snip snip, OutputStream out);
 
   /**
    * Return the special checker to get the version number
@@ -147,7 +147,7 @@ public abstract class TwoFileSnipStorage extends FileS
    *
    * @param snip
    */
-  protected void storageRemoveContent(Snip snip, File snipDir) {
+  protected void storageRemoveContent(snipsnap.api.snip.Snip snip, File snipDir) {
     File contentFile = new File(snipDir, getContentFileName());
     Logger.debug(contentFile+": exists? "+contentFile.exists());
     if (contentFile.exists()) {
@@ -163,7 +163,7 @@ public abstract class TwoFileSnipStorage extends FileS
    *
    * @param snip Snip to remove
    */
-  public void storageRemoveFile(Snip snip, File snipDir) {
+  public void storageRemoveFile(snipsnap.api.snip.Snip snip, File snipDir) {
     storageRemoveMetadata(snip, snipDir);
     storageRemoveContent(snip, snipDir);
   }
@@ -248,7 +248,7 @@ public abstract class TwoFileSnipStorage extends FileS
    * @param snip
    * @param snipDir
    */
-  protected void storeSnip(Snip snip, File snipDir) {
+  protected void storeSnip(snipsnap.api.snip.Snip snip, File snipDir) {
     if (!snipDir.exists()) {
       snipDir.mkdirs();
     }
blob - b48068f283ccdefced2dbb1a6067d282b3522bca
blob + 0465d4ff639e855296229b5a5c647f20d33a1707
--- src/org/snipsnap/snip/storage/UserSerializer.java
+++ src/org/snipsnap/snip/storage/UserSerializer.java
@@ -29,7 +29,7 @@ import org.dom4j.DocumentHelper;
 import org.dom4j.Element;
 import org.radeox.util.logging.Logger;
 import org.snipsnap.user.Roles;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import java.util.HashMap;
 import java.util.Iterator;
@@ -77,7 +77,7 @@ public class UserSerializer extends SerializerSupport 
    * @param user the user to store
    * @return the serialized user as XML
    */
-  public Element serialize(User user) {
+  public Element serialize(snipsnap.api.user.User user) {
     Element userElement = DocumentHelper.createElement(USER);
     userElement.addElement(USER_NAME).addText(user.getLogin());
     userElement.addElement(USER_PASSWORD).addText(notNull(user.getPasswd()));
@@ -99,12 +99,12 @@ public class UserSerializer extends SerializerSupport 
    * @param userEl the XML node containing the user
    * @return the modified user
    */
-  public User deserialize(Element userEl, User user) {
+  public snipsnap.api.user.User deserialize(Element userEl, snipsnap.api.user.User user) {
     Map snipMap = getElementMap(userEl);
     return deserialize(snipMap, user);
   }
 
-  public User deserialize(Map userMap, User user) {
+  public User deserialize(Map userMap, snipsnap.api.user.User user) {
     Iterator elementIt = userMap.keySet().iterator();
     while (elementIt.hasNext()) {
       String element = (String) elementIt.next();
@@ -144,7 +144,7 @@ public class UserSerializer extends SerializerSupport 
     return user;
   }
 
-  public Map createUserMap(User user) {
+  public Map createUserMap(snipsnap.api.user.User user) {
     Map userMap = new HashMap();
     userMap.put(USER_NAME, user.getLogin());
     userMap.put(USER_PASSWORD, notNull(user.getPasswd()));
blob - 9b84ef4ec10eb27c9201c078bc8f11355a6a5587
blob + 54212de0a1a1cdf9ff50bc9168b96c0b6a6178b4
--- src/org/snipsnap/snip/storage/UserStorage.java
+++ src/org/snipsnap/snip/storage/UserStorage.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.snip.storage;
 
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import java.util.List;
 
blob - 5e9c5da39649d8ccb28bec899ed3e20f8b2e83cf
blob + 8805bbed37233f6e36ff013eed4e1a6eb0ad2705
--- src/org/snipsnap/snip/storage/XMLFileSnipStorage.java
+++ src/org/snipsnap/snip/storage/XMLFileSnipStorage.java
@@ -32,7 +32,7 @@ import org.dom4j.io.OutputFormat;
 import org.dom4j.io.SAXReader;
 import org.dom4j.io.XMLWriter;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -76,7 +76,7 @@ public class XMLFileSnipStorage extends OneFileSnipSto
     return null;
   }
 
-  protected void storeSnip(Snip snip, OutputStream out) {
+  protected void storeSnip(snipsnap.api.snip.Snip snip, OutputStream out) {
     Document snipDocument = DocumentHelper.createDocument();
     snipDocument.add(serializer.serialize(snip));
 
blob - 06ec303a77e22a5527d3151b671701e45bf85b3d
blob + 7b029ee402e7411b501df3244e1fe2878f12b620
--- src/org/snipsnap/snip/storage/query/SnipComparator.java
+++ src/org/snipsnap/snip/storage/query/SnipComparator.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.snip.storage.query;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 import java.util.Comparator;
 
@@ -45,10 +45,10 @@ public abstract class SnipComparator implements Compar
    * @param o2 Snip to compare
    */
   public int compare(Object o1, Object o2) {
-    if (!((o1 instanceof Snip) && (o2 instanceof Snip))) {
+    if (!((o1 instanceof snipsnap.api.snip.Snip) && (o2 instanceof snipsnap.api.snip.Snip))) {
       throw new ClassCastException();
     }
-    return compare((Snip) o1, (Snip) o2);
+    return compare((snipsnap.api.snip.Snip) o1, (snipsnap.api.snip.Snip) o2);
 
   }
 
@@ -60,5 +60,5 @@ public abstract class SnipComparator implements Compar
    * @param s1 Snip to compare
    * @param s2 Snip to compare
    */
-  public abstract int compare(Snip s1, Snip s2);
+  public abstract int compare(snipsnap.api.snip.Snip s1, snipsnap.api.snip.Snip s2);
 }
blob - 6a5b9a2f1dc3653950a5c26235a441fdbb1ad125
blob + 8265efb01b8705bd799c8b3f35012acb0947d84a
--- src/org/snipsnap/snip/storage/query/SnipQuery.java
+++ src/org/snipsnap/snip/storage/query/SnipQuery.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.snip.storage.query;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 /**
  * Supplies a query interface for snips
blob - 9cc30be7654cae084c9b261b2b081697170faa80
blob + 4c625be9f0bfd39ffcd2da7fe6c9a6cd96457f92
--- src/org/snipsnap/test/commons/EncoderTest.java
+++ src/org/snipsnap/test/commons/EncoderTest.java
@@ -27,7 +27,7 @@ package org.snipsnap.test.commons;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.snip.SnipLink;
 import org.snipsnap.test.snip.SnipTestSupport;
 import org.snipsnap.util.URLEncoderDecoder;
 import org.radeox.util.Encoder;
@@ -81,13 +81,13 @@ public class EncoderTest extends SnipTestSupport {
   }
 
   public void testCutLength() throws UnsupportedEncodingException {
-    assertEquals(unencodedString.substring(0, 7) + "...", SnipLink.cutLength(unencodedString, 10));
+    assertEquals(unencodedString.substring(0, 7) + "...", snipsnap.api.snip.SnipLink.cutLength(unencodedString, 10));
   }
 
   public void testCutLengthLink() throws UnsupportedEncodingException {
     assertEquals("Cutting link text is broken",
                  "<a href=\"space/" + encodedString + "\">" + unencodedString.substring(0, 22) + "...</a>",
-                 SnipLink.createLink(unencodedString, SnipLink.cutLength(unencodedString, 25)));
+                 snipsnap.api.snip.SnipLink.createLink(unencodedString, snipsnap.api.snip.SnipLink.cutLength(unencodedString, 25)));
   }
 
 }
blob - 782b65f1b53d93760b53690a791f0a45a5f4c736
blob + 70e6591e18f2b11382239cfd276a485a4ee2fac8
--- src/org/snipsnap/test/interceptor/mock/MockSnip.java
+++ src/org/snipsnap/test/interceptor/mock/MockSnip.java
@@ -1,10 +1,11 @@
 package org.snipsnap.test.interceptor.mock;
 
 import org.snipsnap.snip.*;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.attachment.Attachments;
-import org.snipsnap.snip.label.Labels;
+import snipsnap.api.label.Labels;
 import org.snipsnap.user.Permissions;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
@@ -13,8 +14,9 @@ import java.sql.Timestamp;
 import java.util.List;
 
 import gabriel.Principal;
+import snipsnap.api.snip.*;
 
-public abstract class MockSnip implements Snip {
+public abstract class MockSnip implements snipsnap.api.snip.Snip {
   public void setParentName(String name) {
   }
 
@@ -87,7 +89,7 @@ public abstract class MockSnip implements Snip {
   public void setAttachments(Attachments attachments) {
   }
 
-  public Labels getLabels() {
+  public snipsnap.api.label.Labels getLabels() {
     return null;
   }
 
@@ -157,10 +159,10 @@ public abstract class MockSnip implements Snip {
     return null;
   }
 
-  public void setCommentedSnip(Snip comment) {
+  public void setCommentedSnip(snipsnap.api.snip.Snip comment) {
   }
 
-  public Snip getCommentedSnip() {
+  public snipsnap.api.snip.Snip getCommentedSnip() {
     return null;
   }
 
@@ -180,20 +182,20 @@ public abstract class MockSnip implements Snip {
     return null;
   }
 
-  public void addSnip(Snip snip) {
+  public void addSnip(snipsnap.api.snip.Snip snip) {
   }
 
-  public void removeSnip(Snip snip) {
+  public void removeSnip(snipsnap.api.snip.Snip snip) {
   }
 
-  public Snip getParent() {
+  public snipsnap.api.snip.Snip getParent() {
     return null;
   }
 
-  public void setDirectParent(Snip parentSnip) {
+  public void setDirectParent(snipsnap.api.snip.Snip parentSnip) {
   }
 
-  public void setParent(Snip parentSnip) {
+  public void setParent(snipsnap.api.snip.Snip parentSnip) {
   }
 
   public String getShortName() {
blob - fe67976a4be286093519cda47d0ec283bb935fd8
blob + fe795ad2cffe4e9084a5de21edd149cd623645a2
--- src/org/snipsnap/test/label/LabelsTest.java
+++ src/org/snipsnap/test/label/LabelsTest.java
@@ -25,12 +25,12 @@ import java.util.Collection;
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.SnipImpl;
 import org.snipsnap.snip.label.CategoryLabel;
 import org.snipsnap.snip.label.DefaultLabel;
-import org.snipsnap.snip.label.Label;
-import org.snipsnap.snip.label.Labels;
+import snipsnap.api.label.Label;
+import snipsnap.api.label.Labels;
 import org.snipsnap.snip.label.TypeLabel;
 import org.snipsnap.test.snip.SnipTestSupport;
 
@@ -40,8 +40,8 @@ import org.snipsnap.test.snip.SnipTestSupport;
  *
  */
 public class LabelsTest extends SnipTestSupport {
-  private Labels m_emptyLabels;
-  private Labels m_filledLabels;
+  private snipsnap.api.label.Labels m_emptyLabels;
+  private snipsnap.api.label.Labels m_filledLabels;
   private int m_numberOfLabels;
   private Snip m_aSnip;
 
@@ -55,8 +55,8 @@ public class LabelsTest extends SnipTestSupport {
 
   protected void setUp() throws Exception {
     m_aSnip = new SnipImpl("Labeled Snip", "Test Content");
-    m_emptyLabels = new Labels();
-    m_filledLabels = new Labels(m_aSnip, "TypeLabel:Type:Template"
+    m_emptyLabels = new snipsnap.api.label.Labels();
+    m_filledLabels = new snipsnap.api.label.Labels(m_aSnip, "TypeLabel:Type:Template"
         + "|CategoryLabel:Category:zz"
         + "|CategoryLabel:Category:yy"
         + "|CategoryLabel:Category:xx"
@@ -102,11 +102,11 @@ public class LabelsTest extends SnipTestSupport {
   protected void getLabels(Labels aLabels, String name) {
     int before = aLabels.getAll().size();
 
-    Label c1 = new CategoryLabel("1");
-    Label c2 = new CategoryLabel("2");
-    Label c3 = new CategoryLabel("3");
+    snipsnap.api.label.Label c1 = new CategoryLabel("1");
+    snipsnap.api.label.Label c2 = new CategoryLabel("2");
+    snipsnap.api.label.Label c3 = new CategoryLabel("3");
     Label t1 = new TypeLabel("1");
-    Label t2 = new TypeLabel("2");
+    snipsnap.api.label.Label t2 = new TypeLabel("2");
 
     aLabels.addLabel(c1);
     aLabels.addLabel(c2);
@@ -129,12 +129,12 @@ public class LabelsTest extends SnipTestSupport {
     getLabels(m_filledLabels, "m_filledLabels");
   }
 
-  protected void removeLabels(Labels aLabels, String name) {
+  protected void removeLabels(snipsnap.api.label.Labels aLabels, String name) {
     int before = aLabels.getAll().size();
 
-    Label c1 = new CategoryLabel("1");
+    snipsnap.api.label.Label c1 = new CategoryLabel("1");
     Label c2 = new CategoryLabel("2");
-    Label t1 = new TypeLabel("1");
+    snipsnap.api.label.Label t1 = new TypeLabel("1");
 
     aLabels.addLabel(c1);
     aLabels.addLabel(c2);
@@ -164,7 +164,7 @@ public class LabelsTest extends SnipTestSupport {
 
     int before = aLabels.getAll().size();
 
-    Label c1 = new CategoryLabel("1");
+    snipsnap.api.label.Label c1 = new CategoryLabel("1");
     aLabels.addLabel(c1);
 
     aLabels.removeLabel(c1.getName(), c1.getValue());
blob - aca421068b6ac7aa6468c4c446221170936e29c1
blob + db541e95afd51bac09efd022e693d2428f81f93e
--- src/org/snipsnap/test/snip/ImageTest.java
+++ src/org/snipsnap/test/snip/ImageTest.java
@@ -27,9 +27,9 @@ package org.snipsnap.test.snip;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.SnipImpl;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.snip.SnipLink;
 
 import java.io.IOException;
 import java.io.StringWriter;
@@ -49,7 +49,7 @@ public class ImageTest extends SnipTestSupport {
 
   public void testImage() throws IOException {
     StringWriter writer = new StringWriter();
-    SnipLink.appendImage(writer, "test", null);
+    snipsnap.api.snip.SnipLink.appendImage(writer, "test", null);
     assertEquals("Image without alt is rendered",
         "<img src=\"theme/images/test.png\" alt=\"test\" border=\"0\"/>", writer.toString());
   }
@@ -63,7 +63,7 @@ public class ImageTest extends SnipTestSupport {
 
   public void testImageAltExtension() throws IOException {
     StringWriter writer = new StringWriter();
-    SnipLink.appendImage(writer, "test", "alttext", "jpg");
+    snipsnap.api.snip.SnipLink.appendImage(writer, "test", "alttext", "jpg");
     assertEquals("Image with alt and extension is rendered",
         "<img src=\"theme/images/test.jpg\" alt=\"alttext\" border=\"0\"/>", writer.toString());
   }
@@ -71,7 +71,7 @@ public class ImageTest extends SnipTestSupport {
   public void testSnipAttachedImage() throws IOException {
     StringWriter writer = new StringWriter();
     Snip snip = new SnipImpl("test", "test");
-    SnipLink.appendImage(writer, snip, "test", "alttext", "jpg", null);
+    snipsnap.api.snip.SnipLink.appendImage(writer, snip, "test", "alttext", "jpg", null);
     assertEquals("Image without position is rendered",
         "<img src=\"space/test/test.jpg\" alt=\"alttext\" border=\"0\"/>", writer.toString());
   }
blob - 56dd5be682634c9e1b075b8ecb610952fe8bcaff
blob + b97617aed65447fdb3a9dd605b67eec86f44c166
--- src/org/snipsnap/test/snip/PermalinkTest.java
+++ src/org/snipsnap/test/snip/PermalinkTest.java
@@ -27,9 +27,9 @@ package org.snipsnap.test.snip;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.SnipImpl;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.snip.SnipLink;
 
 import java.io.IOException;
 import java.io.StringWriter;
@@ -51,10 +51,10 @@ public class PermalinkTest extends SnipTestSupport {
   }
 
   public void testUrl() {
-    Snip snip = new SnipImpl("test", "test");
+    snipsnap.api.snip.Snip snip = new SnipImpl("test", "test");
     String anchor = "anchor";
     try {
-      SnipLink.appendUrl(writer, snip.getName(), anchor);
+      snipsnap.api.snip.SnipLink.appendUrl(writer, snip.getName(), anchor);
     } catch (IOException e) {
       // Ignore
     }
blob - fb5edf5de0b99375223c7ee6c59b2fe39c8eea9d
blob + 003ed4ad69291e1c3689dcbed0cfaf581bbb80b0
--- src/org/snipsnap/test/snip/SnipPathTest.java
+++ src/org/snipsnap/test/snip/SnipPathTest.java
@@ -27,9 +27,9 @@ package org.snipsnap.test.snip;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.SnipImpl;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpace;
 import org.jmock.Mock;
 
 import java.io.StringWriter;
@@ -46,7 +46,7 @@ public class SnipPathTest extends SnipTestSupport {
   protected void setUp() throws Exception {
     super.setUp();
     writer = new StringWriter();
-    mockSpace = mock(SnipSpace.class);
+    mockSpace = mock(snipsnap.api.snip.SnipSpace.class);
   }
 
   public static Test suite() {
@@ -58,7 +58,7 @@ public class SnipPathTest extends SnipTestSupport {
 
     Snip snip = new SnipImpl("SWT/Stephan/Students", "Test Content");
     try {
-      snip.getPath().append(writer, (SnipSpace) mockSpace.proxy());
+      snip.getPath().append(writer, (snipsnap.api.snip.SnipSpace) mockSpace.proxy());
     } catch (IOException e) {
       fail("Exception thrown "+e.getMessage());
     }
blob - d78767a1bbb83cae7896d25ea8906aa1f85e1615
blob + a87fcf9c38ffc9d186a38cd3696dca5a80c392f5
--- src/org/snipsnap/test/snip/SnipTestSupport.java
+++ src/org/snipsnap/test/snip/SnipTestSupport.java
@@ -27,8 +27,8 @@ package org.snipsnap.test.snip;
 
 import org.jmock.core.MockObjectSupportTestCase;
 import org.jmock.MockObjectTestCase;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.config.ConfigurationProxy;
 
 public class SnipTestSupport extends MockObjectTestCase {
@@ -40,10 +40,10 @@ public class SnipTestSupport extends MockObjectTestCas
 
   protected void setUp() throws Exception {
     // set some basic properties
-    Configuration config = ConfigurationProxy.newInstance();
-    config.set(Configuration.APP_NAME, "SnipSnap");
-    config.set(Configuration.APP_HOST, "snipsnap.org");
-    config.set(Configuration.APP_PATH, "");
+    snipsnap.api.config.Configuration config = ConfigurationProxy.newInstance();
+    config.set(snipsnap.api.config.Configuration.APP_NAME, "SnipSnap");
+    config.set(snipsnap.api.config.Configuration.APP_HOST, "snipsnap.org");
+    config.set(snipsnap.api.config.Configuration.APP_PATH, "");
     Application.get().setConfiguration(config);
     super.setUp();
   }
blob - a777ac216fe20791a63633a18bb6a5b97e2f8b99
blob + 78308b90047d503186bacafa07f385e6d4d997ee
--- src/org/snipsnap/test/user/DefaultPermissionManagerTest.java
+++ src/org/snipsnap/test/user/DefaultPermissionManagerTest.java
@@ -33,7 +33,7 @@ import org.snipsnap.user.DefaultPermissionManager;
 import org.snipsnap.user.Permission;
 import org.snipsnap.user.PermissionManager;
 import org.snipsnap.user.Roles;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 public class DefaultPermissionManagerTest extends TestCase {
 
blob - 084e7399fc1475692df332e42adee51d08643dd8
blob + 0ef7e05b21efdfc25894cf9fdfc7c1e1e1f6e095
--- src/org/snipsnap/user/AuthenticationService.java
+++ src/org/snipsnap/user/AuthenticationService.java
@@ -1,5 +1,8 @@
 package org.snipsnap.user;
 
+import snipsnap.api.user.*;
+import snipsnap.api.user.User;
+
 /*
  * This file is part of "SnipSnap Wiki/Weblog".
  *
@@ -30,5 +33,5 @@ public interface AuthenticationService {
 
   public User authenticate(String login, String passwd, boolean encrypted);
   public User authenticate(String login, String passwd);
-  public boolean isAuthenticated(User user);
+  public boolean isAuthenticated(snipsnap.api.user.User user);
 }
blob - b4d982294716957a2651fb91bff4e302330bdbcb
blob + a13f370dc18c1269ad43c72738ee9bd07d2902d0
--- src/org/snipsnap/user/DefaultAuthenticationService.java
+++ src/org/snipsnap/user/DefaultAuthenticationService.java
@@ -1,6 +1,8 @@
 package org.snipsnap.user;
 
 import org.snipsnap.snip.storage.UserStorage;
+import snipsnap.api.user.*;
+import snipsnap.api.user.User;
 
 /*
  * This file is part of "SnipSnap Wiki/Weblog".
@@ -34,7 +36,7 @@ public class DefaultAuthenticationService implements A
     this.storage = storage;
   }
 
-  public User authenticate(String login, String passwd) {
+  public snipsnap.api.user.User authenticate(String login, String passwd) {
     return authenticate(login, passwd, !ENCRYPTED);
   }
 
blob - 47e75e0dcf2de5ef8846b984325d59c2fb7536a8
blob + 1e89d557733ae256c875419165b4f7f6c102b5ca
--- src/org/snipsnap/user/DefaultPermissionManager.java
+++ src/org/snipsnap/user/DefaultPermissionManager.java
@@ -25,7 +25,9 @@
 package org.snipsnap.user;
 
 import org.snipsnap.snip.Ownable;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.user.*;
+import snipsnap.api.user.User;
 
 import java.util.*;
 
@@ -81,7 +83,7 @@ public class DefaultPermissionManager implements Permi
     //System.err.println("permissionToRoles="+permissionToRoles);
   }
 
-  public boolean check(Permission permission, User user, Snip snip) {
+  public boolean check(Permission permission, snipsnap.api.user.User user, snipsnap.api.snip.Snip snip) {
     // for all roles of the user
     //    check for all permission of the roles
     //       if permission is in
@@ -121,7 +123,7 @@ public class DefaultPermissionManager implements Permi
    * @param object Object with possible owner
    * @return List of roles for user and object
    */
-  private Roles getRoles(User user, Snip object) {
+  private Roles getRoles(User user, snipsnap.api.snip.Snip object) {
     Roles roles = getRoles(user);
 //    if (object instanceof Ownable) {
 //      Ownable o = object;
blob - 5823f2de2b90bac8f59eddf7d491c001f2d81f4f
blob + 4179b9439fbc5b1571d64738955e42c46a14d9a7
--- src/org/snipsnap/user/DefaultUserManager.java
+++ src/org/snipsnap/user/DefaultUserManager.java
@@ -33,6 +33,9 @@ import org.snipsnap.jdbc.IntHolder;
 import java.sql.Timestamp;
 import java.util.*;
 
+import snipsnap.api.user.*;
+import snipsnap.api.user.User;
+
 /**
  * User manager handles all register, creation and authentication of users.
  * Default user manager uses a UserStorage component for storage
@@ -138,7 +141,7 @@ public class DefaultUserManager implements UserManager
    *
    * @param user User to store
    */
-  public void delayedStore(User user) {
+  public void delayedStore(snipsnap.api.user.User user) {
     synchronized (delayed) {
       if (!delayed.contains(user)) {
         delayed.add(user);
blob - 1b2d311aab5ada8665e2ea922960583b4ddb560f
blob + 6ef92f9725986a95e66ec129b0677727251d1e99
--- src/org/snipsnap/user/PasswordService.java
+++ src/org/snipsnap/user/PasswordService.java
@@ -6,6 +6,9 @@ import java.util.Random;
 import java.util.Map;
 import java.util.HashMap;
 
+import snipsnap.api.user.*;
+import snipsnap.api.user.User;
+
 /*
  * This file is part of "SnipSnap Wiki/Weblog".
  *
@@ -47,7 +50,7 @@ public class PasswordService {
   }
 
   public User changePassWord(String key, String passwd) {
-    User user = (User) authKeys.get(key);
+    User user = (snipsnap.api.user.User) authKeys.get(key);
     if (null != user) {
       user.setPasswd(passwd);
       storage.storageStore(user);
blob - 13be9f27a1353c9276eaed17ed64d7df4c9b946b
blob + ad843a7ae90a5796683f1bdc73bdcb47ab0abaa7
--- src/org/snipsnap/user/PermissionManager.java
+++ src/org/snipsnap/user/PermissionManager.java
@@ -24,7 +24,8 @@
  */
 package org.snipsnap.user;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.user.*;
 
 /**
  * Manages security and checks if a role has a permission.
@@ -34,6 +35,6 @@ import org.snipsnap.snip.Snip;
  */
 
 public interface PermissionManager {
-  public boolean check(Permission permission, User user, Snip snip);
+  public boolean check(Permission permission, snipsnap.api.user.User user, Snip snip);
 }
 
blob - bd2e7fe3f8839a2c7188308152874df68c7d6d0e
blob + 48f03318d0b31a6c867f4dd0fc6f902c2da95be7
--- src/org/snipsnap/user/Security.java
+++ src/org/snipsnap/user/Security.java
@@ -26,7 +26,9 @@
 package org.snipsnap.user;
 
 import org.snipsnap.snip.Ownable;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.user.*;
+import snipsnap.api.user.User;
 import org.snipsnap.container.Components;
 
 /**
@@ -60,7 +62,7 @@ public class Security {
    * @param object Object with possible owner
    * @return List of roles for user and object
    */
-  private static Roles getRoles(User user, Snip object) {
+  private static Roles getRoles(User user, snipsnap.api.snip.Snip object) {
     Roles roles = getRoles(user);
 //    if (object instanceof Ownable) {
 //      Ownable o = object;
@@ -81,7 +83,7 @@ public class Security {
    * @param roles Roles object containing the roles
    * @return true if the object has the permission for the roles
    */
-  public static boolean existsPermission(String permission, Snip object, Roles roles) {
+  public static boolean existsPermission(String permission, snipsnap.api.snip.Snip object, Roles roles) {
     Permissions permissions = object.getPermissions();
     return permissions.exists(permission, roles);
   }
@@ -105,7 +107,7 @@ public class Security {
    * @param object the object that should be manipulated
    * @return
    */
-  public static boolean checkPermission(String permission, User user, Snip object) {
+  public static boolean checkPermission(String permission, snipsnap.api.user.User user, snipsnap.api.snip.Snip object) {
     Permissions permissions = object.getPermissions();
     if (null == permissions || permissions.empty()) {
       return true;
blob - dbfc5bed5f0e20863bb8c8a4b1470ab9a619b460
blob + 6374fa151ab9f6fd4678318742eab79ea6fa40ea
--- src/org/snipsnap/user/SessionListener.java
+++ src/org/snipsnap/user/SessionListener.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.user;
 
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 
 import javax.servlet.http.HttpSession;
 import javax.servlet.http.HttpSessionEvent;
blob - 021ced24969a9d0febc3ffac9bb67997146c3e68
blob + f8570a6650db71d3e89c31831d14a000c5b2513e
--- src/org/snipsnap/user/UserManager.java
+++ src/org/snipsnap/user/UserManager.java
@@ -24,6 +24,9 @@
  */
 package org.snipsnap.user;
 
+import snipsnap.api.user.*;
+import snipsnap.api.user.User;
+
 import java.util.List;
 
 /**
@@ -93,7 +96,7 @@ public interface UserManager {
    * @param login Login of the user to load
    * @return
    */
-  public User load(String login);
+  public snipsnap.api.user.User load(String login);
 
   /**
    * Test if an user in the system exists
blob - bddd8564dc5c69f139eed499cba5268316dd13ce
blob + 6ee2b5da5e55c5cb1ad11832b20bec565085c69e
--- src/org/snipsnap/util/ApplicationAwareMap.java
+++ src/org/snipsnap/util/ApplicationAwareMap.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.util;
 
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.radeox.util.logging.Logger;
 
 import java.util.HashMap;
@@ -93,7 +93,7 @@ public class ApplicationAwareMap {
   }
 
   public Object getObject() {
-    String application = (String) Application.get().getObject(Application.OID);
+    String application = (String) snipsnap.api.app.Application.get().getObject(Application.OID);
     return getObject(application);
   }
 
blob - d3c605e11ddda7294e9c452dd08d734840b2d3f0
blob + f3bd4a55eaba3ab87c004d70c1f7c7958b48705b
--- src/org/snipsnap/util/JDBCDatabaseExport.java
+++ src/org/snipsnap/util/JDBCDatabaseExport.java
@@ -28,7 +28,7 @@ import org.dom4j.DocumentHelper;
 import org.dom4j.Element;
 import org.dom4j.io.OutputFormat;
 import org.dom4j.io.XMLWriter;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.snip.storage.SnipDataSerializer;
 import org.snipsnap.snip.storage.Serializer;
 
@@ -116,7 +116,7 @@ public class JDBCDatabaseExport {
     try {
       Class.forName(config.getProperty(Configuration.APP_JDBC_DRIVER));
       Properties jdbcInfo = new Properties();
-      jdbcInfo.setProperty("user", config.getProperty(Configuration.APP_JDBC_USER));
+      jdbcInfo.setProperty("user", config.getProperty(snipsnap.api.config.Configuration.APP_JDBC_USER));
       jdbcInfo.setProperty("password", config.getProperty(Configuration.APP_JDBC_PASSWORD));
       Connection connection = DriverManager.getConnection(config.getProperty(Configuration.APP_JDBC_URL), jdbcInfo);
       store(System.out, appOid, connection);
blob - f5ff7d14a6168ee51b769c82ff011646f8d8b52a
blob + ff4a9d189b1361a6d810f0d54ceeafec36732bef
--- src/org/snipsnap/util/PartialSearcher.java
+++ src/org/snipsnap/util/PartialSearcher.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.util;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 import java.util.*;
 
@@ -61,13 +61,13 @@ public class PartialSearcher implements Map {
      return match(s, s + '\uFFFF');
   }
 
-  public Snip[] match(String start, String end) {
+  public snipsnap.api.snip.Snip[] match(String start, String end) {
     int startIdx = binarySearch(sortedArray, start, 0, sortedArray.length - 1);
     int endIdx = binarySearch(sortedArray, end, 0, sortedArray.length - 1);
 
-    Snip[] objs = new Snip[endIdx - startIdx];
+    snipsnap.api.snip.Snip[] objs = new snipsnap.api.snip.Snip[endIdx - startIdx];
     for (int i = startIdx; i < endIdx; i++) {
-      objs[i - startIdx] = (Snip) hash.get(sortedArray[i]);
+      objs[i - startIdx] = (snipsnap.api.snip.Snip) hash.get(sortedArray[i]);
     }
     return objs;
   }
blob - d9207a7da6be8be61d36b69b60dfcb6710fbc052
blob + 6480367beb5f809d3b2f0d91d51e44e4c5c16c8e
--- src/org/snipsnap/util/PostComment.java
+++ src/org/snipsnap/util/PostComment.java
@@ -24,11 +24,11 @@
  */
 package org.snipsnap.util;
 
-import org.snipsnap.app.Application;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
-import org.snipsnap.user.User;
+import snipsnap.api.app.Application;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
+import snipsnap.api.user.User;
 import org.snipsnap.user.UserManager;
 import org.snipsnap.user.UserManagerFactory;
 
@@ -42,10 +42,10 @@ public class PostComment {
     SnipSpace space = SnipSpaceFactory.getInstance();
 
     Application app = Application.get();
-    User user = UserManagerFactory.getInstance().load("funzel");
+    snipsnap.api.user.User user = UserManagerFactory.getInstance().load("funzel");
     app.setUser(user);
 
-    Snip snip = space.load("about");
+    snipsnap.api.snip.Snip snip = space.load("about");
     snip.getComments().postComment("Hahaha, sowas __bloedes__ ist [das]");
   }
 }
blob - f94458d80e37f777b97ea63170df916ab2086b38
blob + 55d1e0e57781a28032afb96321b3ece232e0fa4c
--- src/org/snipsnap/util/PostLog.java
+++ src/org/snipsnap/util/PostLog.java
@@ -1,10 +1,10 @@
 package org.snipsnap.util;
 
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.snip.Blog;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpaceFactory;
-import org.snipsnap.user.User;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpaceFactory;
+import snipsnap.api.user.User;
 import org.snipsnap.user.UserManager;
 import org.snipsnap.user.UserManagerFactory;
 
@@ -14,7 +14,7 @@ public class PostLog {
 
     Application app = Application.get();
 
-    User user = UserManagerFactory.getInstance().load("funzel");
+    snipsnap.api.user.User user = UserManagerFactory.getInstance().load("funzel");
     app.setUser(user);
 
     Snip snip = blog.post("hallo");
blob - e1bc6e65c026908c7784f1839140eb0951e9c7f4
blob + 7c1fbbe0ab5dbe72922242020f6987f6c25fb84b
--- src/org/snipsnap/util/Presentation.java
+++ src/org/snipsnap/util/Presentation.java
@@ -28,13 +28,13 @@ import org.radeox.filter.FilterPipe;
 import org.radeox.filter.ListFilter;
 import org.radeox.filter.context.FilterContext;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.render.filter.context.SnipFilterContext;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.config.ServerConfiguration;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.config.ConfigurationProxy;
 
 import java.io.IOException;
@@ -59,7 +59,7 @@ public class Presentation {
       System.exit(-1);
     }
 
-    Application app = Application.get();
+    Application app = snipsnap.api.app.Application.get();
 
     Logger.debug("Loading application config.");
     Configuration config = null;
@@ -72,7 +72,7 @@ public class Presentation {
     }
     app.setConfiguration(config);
 
-    SnipSpace space = SnipSpaceFactory.getInstance();
+    snipsnap.api.snip.SnipSpace space = snipsnap.api.snip.SnipSpaceFactory.getInstance();
     FilterPipe fp = new FilterPipe();
     //fp.addFilter(new EscapeFilter());
     //fp.addFilter(new ParamFilter());
@@ -90,7 +90,7 @@ public class Presentation {
     //fp.addFilter(new MarkFilter());
     //fp.addFilter(new KeyFilter());
 
-    Snip snip = space.load(name);
+    snipsnap.api.snip.Snip snip = space.load(name);
     FilterContext context = new SnipFilterContext(snip);
 
     StringTokenizer st = new StringTokenizer(fp.filter(snip.getContent(), context), "\n");
blob - 016dabfcbaa8269402a9e02cccd41bc72bddc016
blob + ff65bf7710ffee8e0d94b4b4e8d05f0e919fcb6e
--- src/org/snipsnap/util/Queue.java
+++ src/org/snipsnap/util/Queue.java
@@ -25,7 +25,7 @@
 package org.snipsnap.util;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -54,12 +54,12 @@ public class Queue {
     queue.addAll(list);
   }
 
-  public Snip add(Snip snip) {
+  public snipsnap.api.snip.Snip add(Snip snip) {
     Logger.debug("Adding snip="+snip);
     Logger.debug("Class="+snip.getClass());
     Iterator iterator = queue.iterator();
     while (iterator.hasNext()) {
-      Snip snip1 = (Snip) iterator.next();
+      snipsnap.api.snip.Snip snip1 = (snipsnap.api.snip.Snip) iterator.next();
     }
     // Queue already contains object, so remove it
     if (queue.contains(snip)) {
@@ -75,7 +75,7 @@ public class Queue {
     return snip;
   }
 
-  public void remove(Snip snip) {
+  public void remove(snipsnap.api.snip.Snip snip) {
     queue.remove(snip);
   }
 
blob - efce29559e3823de202cbd220268232dba261e22
blob + 4b03ca5b0a0f142e1ba4fe3e2c02ac3621538414
--- src/org/snipsnap/util/log/ApplicationLogger.java
+++ src/org/snipsnap/util/log/ApplicationLogger.java
@@ -26,7 +26,7 @@
 package org.snipsnap.util.log;
 
 import org.radeox.util.logging.LogHandler;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 
 /**
  * Concrete Logger that logs to Application
@@ -37,10 +37,10 @@ import org.snipsnap.app.Application;
 
 public abstract class ApplicationLogger implements LogHandler {
   public void log(String output) {
-    Application.get().log(output);
+    snipsnap.api.app.Application.get().log(output);
   }
 
   public void log(String output, Throwable e) {
-    Application.get().log(output+": "+e.getMessage());
+    snipsnap.api.app.Application.get().log(output+": "+e.getMessage());
   }
 }
blob - 9d02ce5966e725936646799b5cfbe99270a1a766
blob + 8a1067f2e2871f0dbeb441f2416057478156b885
--- src/org/snipsnap/util/mail/Mail.java
+++ src/org/snipsnap/util/mail/Mail.java
@@ -26,8 +26,8 @@
 package org.snipsnap.util.mail;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
 
 import javax.mail.*;
 import javax.mail.internet.InternetAddress;
@@ -64,7 +64,7 @@ public class Mail {
 
   public Mail() {
     Properties props = new Properties();
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     String mailhost = config.getMailHost();
     InetAddress addr = null;
     try {
@@ -100,7 +100,7 @@ public class Mail {
     Collection recipientList = new ArrayList();
     recipientList.add(recipient);
     //@TODO get admin mail / host
-    Configuration configuration = Application.get().getConfiguration();
+    Configuration configuration = snipsnap.api.app.Application.get().getConfiguration();
     String sender = configuration.getMailDomain();
     if (null == sender) {
       sender = configuration.getUrl();
blob - 1394b957ed6e8ef06a56a4815a857ee0e35c5251
blob + 675a7365b627997def938e7f2f522a610c85d04f
--- src/org/snipsnap/util/mail/PostDaemon.java
+++ src/org/snipsnap/util/mail/PostDaemon.java
@@ -26,16 +26,16 @@
 package org.snipsnap.util.mail;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.app.ApplicationManager;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.config.ConfigurationManager;
 import org.snipsnap.container.Components;
 import org.snipsnap.snip.Blog;
 import org.snipsnap.snip.BlogKit;
-import org.snipsnap.snip.SnipSpaceFactory;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.user.User;
+import snipsnap.api.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.user.User;
 import org.snipsnap.user.UserManagerFactory;
 import org.snipsnap.net.FileUploadServlet;
 
@@ -195,7 +195,7 @@ public class PostDaemon extends TimerTask {
             String user = app.getConfiguration().getAdminLogin();
             Logger.debug(user);
             Logger.debug((String) app.getObject(Application.OID));
-            User admin = UserManagerFactory.getInstance().load(user);
+            snipsnap.api.user.User admin = UserManagerFactory.getInstance().load(user);
             Logger.debug(admin.toString());
             app.setUser(admin);
             Blog blog = SnipSpaceFactory.getInstance().getBlog();
blob - 5e6aaceab39671db30b5b5e76af5bbcc6d00ce29
blob + aebb07aebeacb567c395c0a120de3d02bcdb44b1
--- src/org/snipsnap/versioning/DefaultVersionManager.java
+++ src/org/snipsnap/versioning/DefaultVersionManager.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.versioning;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.SnipFactory;
 
 import java.util.List;
@@ -46,22 +46,22 @@ public class DefaultVersionManager implements VersionM
     this.service = service;
   }
 
-  public void storeVersion(Snip snip) {
+  public void storeVersion(snipsnap.api.snip.Snip snip) {
     // Consistently increase the version of the snip
     storage.storeVersion(snip);
   };
 
-  public Snip loadVersion(Snip snip, int version) {
+  public snipsnap.api.snip.Snip loadVersion(snipsnap.api.snip.Snip snip, int version) {
     return SnipFactory.wrap(storage.loadVersion(snip, version));
   };
 
-  public List diff(Snip snip, int version1, int version2) {
+  public List diff(snipsnap.api.snip.Snip snip, int version1, int version2) {
 //    System.err.println("old="+version1);
 //    System.err.println("new="+version2);
     return service.diff(loadVersion(snip, version1).getContent(), loadVersion(snip, version2).getContent());
   }
 
-  public List getHistory(Snip snip) {
+  public List getHistory(snipsnap.api.snip.Snip snip) {
     return storage.getVersionHistory(snip);
   }
 }
blob - fddda70a778a61159dcd0aaf112bf964125cc800
blob + 0c6ea710996724d4ce07c52f8157e8549f3c979f
--- src/org/snipsnap/versioning/NullVersionManager.java
+++ src/org/snipsnap/versioning/NullVersionManager.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.versioning;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 import java.util.List;
 import java.util.ArrayList;
blob - e1851266a9af05cdfcecfc474cb95c252f1c234a
blob + c9d671a7676426c6cef743891bce5e6f23df423d
--- src/org/snipsnap/versioning/VersionManager.java
+++ src/org/snipsnap/versioning/VersionManager.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.versioning;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 import java.util.List;
 
@@ -37,8 +37,8 @@ import java.util.List;
  */
 
 public interface VersionManager {
-  public void storeVersion(Snip snip);
-  public Snip loadVersion(Snip snip, int version);
-  public List getHistory(Snip snip);
-  public List diff(Snip snip, int version1, int version2);
+  public void storeVersion(snipsnap.api.snip.Snip snip);
+  public snipsnap.api.snip.Snip loadVersion(snipsnap.api.snip.Snip snip, int version);
+  public List getHistory(snipsnap.api.snip.Snip snip);
+  public List diff(snipsnap.api.snip.Snip snip, int version1, int version2);
 }
\ No newline at end of file
blob - e3afc64bbc23478583cd03266e5b97ddd2017a5b
blob + fc8ca5b51524279e6956740ba4e10518800a2f8e
--- src/org/snipsnap/versioning/VersionStorage.java
+++ src/org/snipsnap/versioning/VersionStorage.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.versioning;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 import java.util.List;
 
blob - fcd1eef88325e891467415d0184d203aa50e39ba
blob + c997325297dfa23ee0c325eb44483a9eb132e1ab
--- src/org/snipsnap/xmlrpc/GeneratorHandler.java
+++ src/org/snipsnap/xmlrpc/GeneratorHandler.java
@@ -26,7 +26,7 @@
 
 package org.snipsnap.xmlrpc;
 
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 
 
 /**
@@ -54,6 +54,6 @@ public class GeneratorHandler extends XmlRpcSupport {
    * @return version string
    */
   public String version() {
-    return "SnipSnap/"+Application.get().getConfiguration().getVersion();
+    return "SnipSnap/"+snipsnap.api.app.Application.get().getConfiguration().getVersion();
   }
 }
blob - 59bed100fe82139d679b4d58f61a825419258fc2
blob + d6cc16908902032b18b57511d8fba24514385abd
--- src/org/snipsnap/xmlrpc/MetaWeblogHandler.java
+++ src/org/snipsnap/xmlrpc/MetaWeblogHandler.java
@@ -27,20 +27,20 @@ package org.snipsnap.xmlrpc;
 
 import org.apache.xmlrpc.XmlRpcException;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.container.Components;
 import org.snipsnap.net.FileUploadServlet;
 import org.snipsnap.feeder.custom.BlogFeeder;
 import org.snipsnap.snip.Blog;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
-import org.snipsnap.snip.SnipSpaceFactory;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.SnipSpaceFactory;
 import org.snipsnap.snip.attachment.Attachment;
 import org.snipsnap.snip.attachment.storage.AttachmentStorage;
 import org.snipsnap.user.AuthenticationService;
 import org.snipsnap.user.Permissions;
 import org.snipsnap.user.Security;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 import java.io.File;
 import java.io.IOException;
@@ -104,7 +104,7 @@ public class MetaWeblogHandler extends XmlRpcSupport i
     }
 
     public Vector getUsersBlogs(String appkey, String username, String password) throws Exception {
-        User user = authenticate(username, password);
+        snipsnap.api.user.User user = authenticate(username, password);
 
         Hashtable blog = new Hashtable(3);
         blog.put("url", Application.get().getConfiguration().getUrl());
@@ -127,8 +127,8 @@ public class MetaWeblogHandler extends XmlRpcSupport i
                               String username,
                               String password,
                               boolean publish) throws Exception {
-        User user = authenticate(username, password);
-        Snip snip = SnipSpaceFactory.getInstance().load(postId);
+        snipsnap.api.user.User user = authenticate(username, password);
+        snipsnap.api.snip.Snip snip = snipsnap.api.snip.SnipSpaceFactory.getInstance().load(postId);
         SnipSpaceFactory.getInstance().remove(snip);
         return true;
     }
@@ -149,9 +149,9 @@ public class MetaWeblogHandler extends XmlRpcSupport i
 
 
     public String newPost(String blogid, String username, String password, Hashtable postcontent, boolean publish) throws Exception {
-        User user = authenticate(username, password);
+        snipsnap.api.user.User user = authenticate(username, password);
 
-        Blog blog = SnipSpaceFactory.getInstance().getBlog(blogid);
+        Blog blog = snipsnap.api.snip.SnipSpaceFactory.getInstance().getBlog(blogid);
 
         String title = (String) postcontent.get("title");
         String content = (String) postcontent.get("description");
@@ -169,8 +169,8 @@ public class MetaWeblogHandler extends XmlRpcSupport i
     public Hashtable getPost(String postId,
                              String username,
                              String password) throws XmlRpcException {
-        User user = authenticate(username, password);
-        Snip snip = SnipSpaceFactory.getInstance().load(postId);
+        snipsnap.api.user.User user = authenticate(username, password);
+        snipsnap.api.snip.Snip snip = snipsnap.api.snip.SnipSpaceFactory.getInstance().load(postId);
         Hashtable post = new Hashtable();
         post.put("content", snip.getXMLContent());
         post.put("userid", snip.getOUser());  //todo: why does getOUser work here but not with RSSSnip? (see getRecentPosts())
@@ -197,9 +197,9 @@ public class MetaWeblogHandler extends XmlRpcSupport i
     }
 
     public boolean editPost(String postId, String username, String password, Hashtable content, boolean publish) throws Exception {
-        User user = authenticate(username, password);
-        SnipSpace space = SnipSpaceFactory.getInstance();
-        Snip snip = space.load(postId);
+        snipsnap.api.user.User user = authenticate(username, password);
+        snipsnap.api.snip.SnipSpace space = snipsnap.api.snip.SnipSpaceFactory.getInstance();
+        snipsnap.api.snip.Snip snip = space.load(postId);
         String title = (String) content.get("title");
         String body = (String) content.get("description");
         //could deal with "dateCreated" later
@@ -220,7 +220,7 @@ public class MetaWeblogHandler extends XmlRpcSupport i
 
         Vector posts = new Vector(children.size());
         for (Iterator i = children.iterator(); i.hasNext() && numberOfPosts-- > 0;) {
-            Snip snip = (Snip) i.next();
+            snipsnap.api.snip.Snip snip = (snipsnap.api.snip.Snip) i.next();
             Hashtable data = new Hashtable();
             //todo: decide what the policy for null values should be.
             //todo: will require deciding (then comenting) what the postconditions of
@@ -252,7 +252,7 @@ public class MetaWeblogHandler extends XmlRpcSupport i
                                     String username,
                                     String password,
                                     Hashtable content) throws Exception {
-        User user = authenticate(username, password);
+        snipsnap.api.user.User user = authenticate(username, password);
         System.out.println("new media object.");
 
         byte[] data = (byte[]) content.get("bits");
@@ -261,8 +261,8 @@ public class MetaWeblogHandler extends XmlRpcSupport i
         String snipId = (String) content.get("postid");
         System.out.println("the postid is: "+snipId);
 
-        SnipSpace space = SnipSpaceFactory.getInstance();
-        Snip snip = space.load(snipId);
+        snipsnap.api.snip.SnipSpace space = SnipSpaceFactory.getInstance();
+        snipsnap.api.snip.Snip snip = space.load(snipId);
 
         if (!accessController.checkPermission(Application.get().getUser(), AccessController.ADD_ATTACHMENT, snip)) {
             throw new XmlRpcException(0, "Do not have write access to this snip");
@@ -300,7 +300,7 @@ public class MetaWeblogHandler extends XmlRpcSupport i
                 attachment.setSize(data.length);
                 snip.getAttachments().addAttachment(attachment);
 
-                SnipSpaceFactory.getInstance().store(snip);
+                snipsnap.api.snip.SnipSpaceFactory.getInstance().store(snip);
                 Hashtable result = new Hashtable(1);
                 // this most probably does not return an url
                 result.put("url", attachment.getLocation());//does this return a url?
blob - 648cd9b5f7970b16b8a43b45090720c67770ec49
blob + 40a7faf07df71316a4195b9686fc309b7095ae46
--- src/org/snipsnap/xmlrpc/SnipSnapHandler.java
+++ src/org/snipsnap/xmlrpc/SnipSnapHandler.java
@@ -28,20 +28,20 @@ package org.snipsnap.xmlrpc;
 import org.apache.xmlrpc.XmlRpcException;
 import org.dom4j.io.OutputFormat;
 import org.dom4j.io.XMLWriter;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.app.ApplicationManager;
-import org.snipsnap.config.Configuration;
+import snipsnap.api.config.Configuration;
 import org.snipsnap.config.ConfigurationManager;
 import org.snipsnap.config.ConfigurationProxy;
 import org.snipsnap.config.Globals;
 import org.snipsnap.config.InitializeDatabase;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 import org.snipsnap.snip.XMLSnipExport;
 import org.snipsnap.snip.XMLSnipImport;
 import org.snipsnap.snip.storage.SnipSerializer;
 import org.snipsnap.user.AuthenticationService;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 import org.snipsnap.user.UserManager;
 
 import java.io.ByteArrayInputStream;
@@ -100,7 +100,7 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
       return true;
     }
 
-    User user = authenticationService.authenticate(username, password);
+    snipsnap.api.user.User user = authenticationService.authenticate(username, password);
     if (user != null && user.isAdmin()) {
       Application.get().setUser(user);
       return true;
@@ -123,8 +123,8 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
         if (prefix.equals(vector.get(0))) {
           vector.remove(0);
         }
-        Application.get().setConfiguration(appConfig);
-        Application.get().storeObject(Application.OID, appOid);
+        snipsnap.api.app.Application.get().setConfiguration(appConfig);
+        Application.get().storeObject(snipsnap.api.app.Application.OID, appOid);
         return super.execute(method, vector, user, password);
       }
       throw new Exception("no instance found for prefix '" + prefix + "'");
@@ -137,7 +137,7 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
   }
 
   public String getSnipAsXml(String name) {
-    Snip snip = space.load(name);
+    snipsnap.api.snip.Snip snip = space.load(name);
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     OutputFormat outputFormat = OutputFormat.createCompactFormat();
     outputFormat.setEncoding("UTF-8");
@@ -152,17 +152,17 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
   }
 
   public String getSnip(String name) {
-    Snip snip = space.load(name);
+    snipsnap.api.snip.Snip snip = space.load(name);
     return snip.getContent();
   }
 
   public String createSnip(String name, String content) {
-    Snip snip = space.create(name, content);
+    snipsnap.api.snip.Snip snip = space.create(name, content);
     return name;
   }
 
   public String removeSnip(String name) {
-    Snip snip = space.load(name);
+    snipsnap.api.snip.Snip snip = space.load(name);
     space.remove(snip);
     return name;
   }
@@ -186,7 +186,7 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
    * @return isAuthenticated True when the user can be authenticated
    */
   public boolean authenticateUser(String login, String passwd) throws XmlRpcException {
-    User user = authenticationService.authenticate(login, passwd);
+    snipsnap.api.user.User user = authenticationService.authenticate(login, passwd);
     return (null != user);
   }
 
@@ -199,14 +199,14 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
    * @throws IOException
    */
   public byte[] dumpXml() throws IOException {
-    Configuration config = Application.get().getConfiguration();
+    Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     ByteArrayOutputStream exportStream = new ByteArrayOutputStream();
     XMLSnipExport.store(exportStream, space.getAll(), um.getAll(), null, null, config.getFilePath());
     return exportStream.toByteArray();
   }
 
   public byte[] dumpXml(String match) throws IOException {
-    Configuration config = Application.get().getConfiguration();
+    snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     ByteArrayOutputStream exportStream = new ByteArrayOutputStream();
     XMLSnipExport.store(exportStream, Arrays.asList(space.match(match)), null, null, null, config.getFilePath());
     return exportStream.toByteArray();
@@ -278,7 +278,7 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
    * @param passwd     admin password
    */
   public String install(String prefix, String adminLogin, String passwd, Hashtable appConfig) throws Exception {
-    appConfig.put(Configuration.APP_ADMIN_LOGIN, adminLogin);
+    appConfig.put(snipsnap.api.config.Configuration.APP_ADMIN_LOGIN, adminLogin);
     appConfig.put(Configuration.APP_ADMIN_PASSWORD, passwd);
     return install(prefix, appConfig);
   }
blob - e0aa9e7839aae87696d7d6bdbc0ffdebbbe31d96
blob + b014bcf02203037868f83a3e531fa818d4a53d34
--- src/org/snipsnap/xmlrpc/WeblogsPing.java
+++ src/org/snipsnap/xmlrpc/WeblogsPing.java
@@ -26,10 +26,10 @@
 package org.snipsnap.xmlrpc;
 
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipSpace;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipSpace;
 import org.snipsnap.xmlrpc.ping.PingHandler;
 import org.snipsnap.notification.Message;
 import org.snipsnap.notification.MessageService;
@@ -58,13 +58,13 @@ import java.util.Map;
 public class WeblogsPing extends Thread implements Consumer {
   private final static String WEBLOGSPING = "SnipSnap/config/weblogsping";
 
-  private Configuration config;
+  private snipsnap.api.config.Configuration config;
   private Map appParams;
 
-  private Snip weblog;
+  private snipsnap.api.snip.Snip weblog;
   private static List handlers;
 
-  public WeblogsPing(Configuration configuration, Snip weblog) {
+  public WeblogsPing(snipsnap.api.config.Configuration configuration, Snip weblog) {
     this.appParams = Application.get().getParameters();
     this.config = configuration;
     this.weblog = weblog;
@@ -84,9 +84,9 @@ public class WeblogsPing extends Thread implements Con
 
   public void run() {
     // ensure the right configuration is set
-    Application.get().setConfiguration(config);
-    Application.get().setParameters(appParams);
-    if (config.allow(Configuration.APP_PERM_WEBLOGSPING)) {
+    snipsnap.api.app.Application.get().setConfiguration(config);
+    snipsnap.api.app.Application.get().setParameters(appParams);
+    if (config.allow(snipsnap.api.config.Configuration.APP_PERM_WEBLOGSPING)) {
       if (handlers.size() > 0) {
         Iterator iterator = handlers.iterator();
         while (iterator.hasNext()) {
@@ -124,7 +124,7 @@ public class WeblogsPing extends Thread implements Con
 
   public void consume(Message message) {
     if (Message.SNIP_MODIFIED.equals(message.getType())) {
-      Snip snip = (Snip) message.getValue();
+      snipsnap.api.snip.Snip snip = (snipsnap.api.snip.Snip) message.getValue();
       if (WEBLOGSPING.equals(snip.getName())) {
         try {
           Logger.log("reloading weblogs ping handler for: " + snip.getApplication());
blob - cda697c843ab5c17d486f9713401bbb599b3cfdb
blob + 1719abcd5526b6a921bf9176c42a8944dba14c19
--- src/org/snipsnap/xmlrpc/XmlRpcSupport.java
+++ src/org/snipsnap/xmlrpc/XmlRpcSupport.java
@@ -28,9 +28,9 @@ package org.snipsnap.xmlrpc;
 
 import org.apache.xmlrpc.XmlRpcException;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
+import snipsnap.api.app.Application;
 import org.snipsnap.user.AuthenticationService;
-import org.snipsnap.user.User;
+import snipsnap.api.user.User;
 
 /**
  * Utility base class for XML-RPC handlers.
@@ -66,7 +66,7 @@ public abstract class XmlRpcSupport implements XmlRpcH
    */
 
   protected User authenticate(String username, String password) throws XmlRpcException {
-    User user = authenticationService.authenticate(username, password);
+    snipsnap.api.user.User user = authenticationService.authenticate(username, password);
     if (user != null) {
       Application.get().setUser(user);
       return user;
blob - 072776e86898b3ce3333068393a712c9ac6e2581
blob + a5b68812f4313b293d4ebe678b287bb1351bc737
--- src/org/snipsnap/xmlrpc/ping/ExtendedPingHandler.java
+++ src/org/snipsnap/xmlrpc/ping/ExtendedPingHandler.java
@@ -28,9 +28,9 @@ package org.snipsnap.xmlrpc.ping;
 import org.apache.xmlrpc.XmlRpcClient;
 import org.apache.xmlrpc.XmlRpc;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.snip.Snip;
 
 import java.util.Vector;
 
@@ -51,8 +51,8 @@ public class ExtendedPingHandler implements PingHandle
     this.url = pingUrl;
   }
 
-  public void ping(Snip weblog) {
-    Configuration config = Application.get().getConfiguration();
+  public void ping(snipsnap.api.snip.Snip weblog) {
+    snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     Vector params = new Vector();
     try {
       // Ping blog.gs
blob - 41bcf5cca2727e37bb7a973353b090c0991b50b9
blob + f8918c05f8f93539fc38360a1f02b5bb1aa75696
--- src/org/snipsnap/xmlrpc/ping/PingHandler.java
+++ src/org/snipsnap/xmlrpc/ping/PingHandler.java
@@ -25,7 +25,7 @@
 
 package org.snipsnap.xmlrpc.ping;
 
-import org.snipsnap.snip.Snip;
+import snipsnap.api.snip.Snip;
 
 /**
  * Interface for all Weblogs.com style ping handlers
blob - 7af9d949c890f94541603c6fb4d0980a9d367632
blob + 04259240daddbe8ea8bb76a65fdf70209b501bab
--- src/org/snipsnap/xmlrpc/ping/RssPingHandler.java
+++ src/org/snipsnap/xmlrpc/ping/RssPingHandler.java
@@ -28,9 +28,9 @@ package org.snipsnap.xmlrpc.ping;
 import org.apache.xmlrpc.XmlRpcClient;
 import org.apache.xmlrpc.XmlRpc;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.snip.Snip;
 
 import java.util.Vector;
 
@@ -51,8 +51,8 @@ public class RssPingHandler implements PingHandler {
     this.url = pingUrl;
   }
 
-  public void ping(Snip weblog) {
-    Configuration config = Application.get().getConfiguration();
+  public void ping(snipsnap.api.snip.Snip weblog) {
+    Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     Vector params = new Vector();
     try {
       // Ping RSS weblogs.com
blob - 7cabe5afc86487cdb41945ee0659b2c139337ace
blob + 27826e2630036d4864fee14d90a9fe30faebf103
--- src/org/snipsnap/xmlrpc/ping/SimplePingHandler.java
+++ src/org/snipsnap/xmlrpc/ping/SimplePingHandler.java
@@ -28,9 +28,9 @@ package org.snipsnap.xmlrpc.ping;
 import org.apache.xmlrpc.XmlRpcClient;
 import org.apache.xmlrpc.XmlRpc;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.snip.Snip;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.snip.Snip;
 
 import java.util.Vector;
 
blob - 10d43c29d8b3b2ace3352c700b920cea73ac99ca
blob + f53738863fe030b282edca726ba81f77c5171acd
--- src/org/snipsnap/xmlrpc/ping/SnipSnapPingHandler.java
+++ src/org/snipsnap/xmlrpc/ping/SnipSnapPingHandler.java
@@ -28,10 +28,10 @@ package org.snipsnap.xmlrpc.ping;
 import org.apache.xmlrpc.XmlRpcClient;
 import org.apache.xmlrpc.XmlRpc;
 import org.radeox.util.logging.Logger;
-import org.snipsnap.app.Application;
-import org.snipsnap.config.Configuration;
-import org.snipsnap.snip.Snip;
-import org.snipsnap.snip.SnipLink;
+import snipsnap.api.app.Application;
+import snipsnap.api.config.Configuration;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
 
 import java.util.Vector;
 
@@ -52,8 +52,8 @@ public class SnipSnapPingHandler implements PingHandle
     this.url = pingUrl;
   }
 
-  public void ping(Snip weblog) {
-    Configuration config = Application.get().getConfiguration();
+  public void ping(snipsnap.api.snip.Snip weblog) {
+    Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     Vector params = new Vector();
     try {
       // Ping blog.gs
blob - /dev/null
blob + cdb3158253eaed8dccf8d8d1e47d22a74ddd2918 (mode 644)
--- /dev/null
+++ src/snipsnap/api/snip/SnipSpace.java
@@ -0,0 +1,131 @@
+/*                                  n
+ * This file is part of "SnipSnap Wiki/Weblog".
+ *
+ * Copyright (c) 2002 Stephan J. Schmidt, Matthias L. Jugel
+ * All Rights Reserved.
+ *
+ * Please visit http://snipsnap.org/ for updates and contact.
+ *
+ * --LICENSE NOTICE--
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * --LICENSE NOTICE--
+ */
+package snipsnap.api.snip;
+
+import org.apache.lucene.search.Hits;
+import org.snipsnap.snip.Blog;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+/**
+ * SnipSpace interface handles all the operations with snips like
+ * loading, storing, searching et.c
+ *
+ * @author Stephan J. Schmidt
+ * @version $Id: SnipSpace.java 1697 2004-07-02 09:22:05Z stephan $
+ */
+
+public interface SnipSpace  {
+  public String getETag();
+
+  // A snip is changed by the user (created, stored)
+  public void changed(snipsnap.api.snip.Snip snip);
+
+  public void init();
+
+  public void setETag();
+
+  public int getSnipCount();
+
+  public List getChanged();
+
+  public List getChanged(int count);
+
+  public List getAll();
+
+  public List getSince(Timestamp date);
+
+  public List getByDate(String nameSpace, String start, String end);
+
+  /**
+   * A list of Snips, ordered by "hotness", currently
+   * viewcount.
+   *
+   * @param count number of snips in the result
+   * @return List of snips, ordered by hotness
+   */
+  public List getHot(int count);
+
+  public List getComments(snipsnap.api.snip.Snip snip);
+
+  public List getByUser(String login);
+
+  public List getChildren(snipsnap.api.snip.Snip snip);
+
+  public List getChildrenDateOrder(snipsnap.api.snip.Snip snip, int count);
+
+  public List getChildrenModifiedOrder(snipsnap.api.snip.Snip snip, int count);
+
+  public void reIndex();
+
+  public Hits search(String queryString);
+
+  public Blog getBlog();
+
+  public Blog getBlog(String name);
+
+  public boolean exists(String name);
+
+  public snipsnap.api.snip.Snip[] match(String pattern);
+
+  public snipsnap.api.snip.Snip[] match(String start, String end);
+
+  public snipsnap.api.snip.Snip load(String name);
+
+  public void systemStore(List snips);
+
+  public void store(snipsnap.api.snip.Snip snip);
+
+  /**
+   * Method with with wich the system can store snips.
+   * This methode does not change the mTime, the mUser,
+   * reindex the snip or add the snip to the modified list
+   *
+   * @param snip The snip to store
+   */
+  public void systemStore(snipsnap.api.snip.Snip snip);
+
+  /**
+   * Delays the storage of a snip for some time. Some information
+   * in a snip are changeg every view. To not store a snip every
+   * time it is viewed, delay the store and wait until some changes
+   * are cummulated. Should only be used, when the loss of the
+   * changes is tolerable.
+   *
+   * @param snip Snip to delay for storage
+   */
+  public void delayedStore(snipsnap.api.snip.Snip snip);
+
+  /**
+   * Create a new snip with the specified content.
+   * @param name the name of the new snip
+   * @param content initial content
+   * @return the new copied snip
+   */
+  public snipsnap.api.snip.Snip create(String name, String content);
+
+  public void remove(snipsnap.api.snip.Snip snip);
+}
\ No newline at end of file