diff --git a/embedded-sample-trunk/pom.xml b/embedded-sample-trunk/pom.xml
new file mode 100644
index 0000000..9a56197
--- /dev/null
+++ b/embedded-sample-trunk/pom.xml
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.directory.server</groupId>
+  <artifactId>apacheds-embedded-sample-trunk</artifactId>
+  <version>1.5.8-SNAPSHOT</version>
+
+  <name>ApacheDS embedded sample for trunk ( current version 1.5.8-SNAPSHOT )</name>
+  <description>ApacheDS embedded sample</description>
+  <packaging>jar</packaging>  
+
+  <dependencies>
+     <dependency>
+      <groupId>org.apache.directory.server</groupId>
+      <artifactId>apacheds-all</artifactId>
+      <version>1.5.8-SNAPSHOT</version>
+        <!-- shared-ldap-schema module needs to be excluded to avoid multiple schema resources on the classpath-->
+      <exclusions>
+        <exclusion>
+          <groupId>org.apache.directory.shared</groupId>
+          <artifactId>shared-ldap-schema</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <version>1.5.6</version>
+    </dependency>
+    
+    <!-- un-comment the below dependencies after commenting the above apacheds-all dependency
+         if you want to debug
+     -->
+<!-- 
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-core</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-core-annotations</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-core-api</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-core-avl</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-core-constants</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-core-jndi</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-interceptor-kerberos</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-jdbm</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-jdbm-partition</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-kerberos-shared</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-ldif-partition</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-protocol-changepw</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-protocol-dhcp</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-protocol-dns</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-protocol-kerberos</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-protocol-ldap</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-protocol-ntp</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-protocol-shared</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-server-annotations</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-server-jndi</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-server-replication</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-test-framework</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-xdbm-partition</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-xdbm-tools</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+-->
+  </dependencies>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <configuration>
+
+            <source>1.5</source>
+            <target>1.5</target>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+</project>
+
diff --git a/embedded-sample-trunk/src/main/java/org/apache/directory/seserver/EmbeddedADSVerTrunk.java b/embedded-sample-trunk/src/main/java/org/apache/directory/seserver/EmbeddedADSVerTrunk.java
new file mode 100644
index 0000000..58d286b
--- /dev/null
+++ b/embedded-sample-trunk/src/main/java/org/apache/directory/seserver/EmbeddedADSVerTrunk.java
@@ -0,0 +1,292 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.directory.seserver;
+
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.List;
+
+import org.apache.directory.server.constants.ServerDNConstants;
+import org.apache.directory.server.core.DefaultDirectoryService;
+import org.apache.directory.server.core.DirectoryService;
+import org.apache.directory.server.core.partition.Partition;
+import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmIndex;
+import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmPartition;
+import org.apache.directory.server.core.partition.ldif.LdifPartition;
+import org.apache.directory.server.core.schema.SchemaPartition;
+import org.apache.directory.server.ldap.LdapServer;
+import org.apache.directory.server.protocol.shared.transport.TcpTransport;
+import org.apache.directory.server.xdbm.Index;
+import org.apache.directory.shared.ldap.entry.Entry;
+import org.apache.directory.shared.ldap.exception.LdapException;
+import org.apache.directory.shared.ldap.name.DN;
+import org.apache.directory.shared.ldap.schema.SchemaManager;
+import org.apache.directory.shared.ldap.schema.ldif.extractor.SchemaLdifExtractor;
+import org.apache.directory.shared.ldap.schema.ldif.extractor.impl.DefaultSchemaLdifExtractor;
+import org.apache.directory.shared.ldap.schema.loader.ldif.LdifSchemaLoader;
+import org.apache.directory.shared.ldap.schema.manager.impl.DefaultSchemaManager;
+import org.apache.directory.shared.ldap.schema.registries.SchemaLoader;
+
+
+/**
+ * A simple example exposing how to embed Apache Directory Server from the bleeding trunk
+ * into an application.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class EmbeddedADSVerTrunk
+{
+    /** The directory service */
+    private DirectoryService service;
+
+    /** The LDAP server */
+    private LdapServer server;
+
+
+    /**
+     * Add a new partition to the server
+     *
+     * @param partitionId The partition Id
+     * @param partitionDn The partition DN
+     * @return The newly added partition
+     * @throws Exception If the partition can't be added
+     */
+    private Partition addPartition( String partitionId, String partitionDn ) throws Exception
+    {
+        // Create a new partition named 'foo'.
+        JdbmPartition partition = new JdbmPartition();
+        partition.setId( partitionId );
+        partition.setPartitionDir( new File( service.getWorkingDirectory(), partitionId ) );
+        partition.setSuffix( new DN( partitionDn ) );
+        // schema manager will be automatically set while adding the partition to the service
+        service.addPartition( partition );
+        
+        return partition;
+    }
+
+
+    /**
+     * Add a new set of index on the given attributes
+     *
+     * @param partition The partition on which we want to add index
+     * @param attrs The list of attributes to index
+     */
+    private void addIndex( Partition partition, String... attrs )
+    {
+        // Index some attributes on the apache partition
+        HashSet<Index<?, Entry, Long>> indexedAttributes = new HashSet<Index<?, Entry, Long>>();
+
+        for ( String attribute : attrs )
+        {
+            indexedAttributes.add( new JdbmIndex<String, Entry>( attribute ) );
+        }
+
+        ( ( JdbmPartition ) partition ).setIndexedAttributes( indexedAttributes );
+    }
+
+    
+    /**
+     * initialize the schema manager and add the schema partition to diectory service
+     *
+     * @throws Exception if the schema LDIF files are not found on the classpath
+     */
+    private void initSchemaPartition() throws Exception
+    {
+        SchemaPartition schemaPartition = service.getSchemaService().getSchemaPartition();
+
+        // Init the LdifPartition
+        LdifPartition ldifPartition = new LdifPartition();
+        String workingDirectory = service.getWorkingDirectory().getPath();
+        ldifPartition.setWorkingDirectory( workingDirectory + "/schema" );
+
+        // Extract the schema on disk (a brand new one) and load the registries
+        File schemaRepository = new File( workingDirectory, "schema" );
+        SchemaLdifExtractor extractor = new DefaultSchemaLdifExtractor( new File( workingDirectory ) );
+        extractor.extractOrCopy( true );
+
+        schemaPartition.setWrappedPartition( ldifPartition );
+
+        SchemaLoader loader = new LdifSchemaLoader( schemaRepository );
+        SchemaManager schemaManager = new DefaultSchemaManager( loader );
+        service.setSchemaManager( schemaManager );
+
+        // We have to load the schema now, otherwise we won't be able
+        // to initialize the Partitions, as we won't be able to parse 
+        // and normalize their suffix DN
+        schemaManager.loadAllEnabled();
+
+        schemaPartition.setSchemaManager( schemaManager );
+
+        List<Throwable> errors = schemaManager.getErrors();
+
+        if ( errors.size() != 0 )
+        {
+            throw new Exception( "Schema load failed : " + errors );
+        }
+    }
+    
+    
+    /**
+     * Initialize the server. It creates the partition, adds the index, and
+     * injects the context entries for the created partitions.
+     *
+     * @param workDir the directory to be used for storing the data
+     * @throws Exception if there were some problems while initializing the system
+     */
+    private void initDirectoryService( File workDir ) throws Exception
+    {
+        // Initialize the LDAP service
+        service = new DefaultDirectoryService();
+        service.setWorkingDirectory( workDir );
+        
+        // first load the schema
+        initSchemaPartition();
+        
+        // then the system partition
+        // this is a MANDATORY partition
+        // DO NOT add this via addPartition() method, trunk code complains about duplicate partition
+        // while initializing 
+        JdbmPartition systemPartition = new JdbmPartition();
+        systemPartition.setId( "system" );
+        systemPartition.setPartitionDir( new File( service.getWorkingDirectory(), systemPartition.getId() ) );
+        systemPartition.setSuffix( new DN( ServerDNConstants.SYSTEM_DN ) );
+        systemPartition.setSchemaManager( service.getSchemaManager() );
+        
+        // mandatory to call this method to set the system partition
+        // Note: this system partition might be removed from trunk
+        service.setSystemPartition( systemPartition );
+        
+        // Disable the ChangeLog system
+        service.getChangeLog().setEnabled( false );
+        service.setDenormalizeOpAttrsEnabled( true );
+
+        // Now we can create as many partitions as we need
+        // Create some new partitions named 'foo', 'bar' and 'apache'.
+        Partition fooPartition = addPartition( "foo", "dc=foo,dc=com" );
+        Partition barPartition = addPartition( "bar", "dc=bar,dc=com" );
+        Partition apachePartition = addPartition( "apache", "dc=apache,dc=org" );
+
+        // Index some attributes on the apache partition
+        addIndex( apachePartition, "objectClass", "ou", "uid" );
+
+        // And start the service
+        service.startup();
+
+        // Inject the foo root entry if it does not already exist
+        try
+        {
+            service.getAdminSession().lookup( fooPartition.getSuffix() );
+        }
+        catch ( LdapException lnnfe )
+        {
+            DN dnFoo = new DN( "dc=foo,dc=com" );
+            Entry entryFoo = service.newEntry( dnFoo );
+            entryFoo.add( "objectClass", "top", "domain", "extensibleObject" );
+            entryFoo.add( "dc", "foo" );
+            service.getAdminSession().add( entryFoo );
+        }
+
+        // Inject the bar root entry
+        try
+        {
+            service.getAdminSession().lookup( barPartition.getSuffix() );
+        }
+        catch ( LdapException lnnfe )
+        {
+            DN dnBar = new DN( "dc=bar,dc=com" );
+            Entry entryBar = service.newEntry( dnBar );
+            entryBar.add( "objectClass", "top", "domain", "extensibleObject" );
+            entryBar.add( "dc", "bar" );
+            service.getAdminSession().add( entryBar );
+        }
+
+        // Inject the apache root entry
+        if ( !service.getAdminSession().exists( apachePartition.getSuffix() ) )
+        {
+            DN dnApache = new DN( "dc=Apache,dc=Org" );
+            Entry entryApache = service.newEntry( dnApache );
+            entryApache.add( "objectClass", "top", "domain", "extensibleObject" );
+            entryApache.add( "dc", "Apache" );
+            service.getAdminSession().add( entryApache );
+        }
+
+        // We are all done !
+    }
+
+
+    /**
+     * Creates a new instance of EmbeddedADS. It initializes the directory service.
+     *
+     * @throws Exception If something went wrong
+     */
+    public EmbeddedADSVerTrunk( File workDir ) throws Exception
+    {
+        initDirectoryService( workDir );
+    }
+
+    
+    /**
+     * starts the LdapServer
+     *
+     * @throws Exception
+     */
+    public void startServer() throws Exception
+    {
+        server = new LdapServer();
+        int serverPort = 10389;
+        server.setTransports( new TcpTransport( serverPort ) );
+        server.setDirectoryService( service );
+        
+        server.start();
+    }
+
+    
+    /**
+     * Main class.
+     *
+     * @param args Not used. 
+     */
+    public static void main( String[] args ) 
+    {
+        try
+        {
+            File workDir = new File( System.getProperty( "java.io.tmpdir" ) + "/server-work" );
+            workDir.mkdirs();
+            
+            // Create the server
+            EmbeddedADSVerTrunk ads = new EmbeddedADSVerTrunk( workDir );
+
+            // Read an entry
+            Entry result = ads.service.getAdminSession().lookup( new DN( "dc=apache,dc=org" ) );
+
+            // And print it if available
+            System.out.println( "Found entry : " + result );
+            
+            // optionally we can start a server too
+            ads.startServer();
+        }
+        catch ( Exception e )
+        {
+            // Ok, we have something wrong going on ...
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/embedded-sample-trunk/src/main/resources/log4j.properties b/embedded-sample-trunk/src/main/resources/log4j.properties
new file mode 100644
index 0000000..6476bd2
--- /dev/null
+++ b/embedded-sample-trunk/src/main/resources/log4j.properties
@@ -0,0 +1,59 @@
+#############################################################################
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#############################################################################
+log4j.rootCategory=WARN, stdout, R
+
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+
+log4j.appender.R=org.apache.log4j.RollingFileAppender
+log4j.appender.R.File=apacheds-rolling.log
+
+log4j.appender.R.MaxFileSize=1024KB
+# Keep some backup files
+log4j.appender.R.MaxBackupIndex=5
+
+log4j.appender.R.layout=org.apache.log4j.PatternLayout
+log4j.appender.R.layout.ConversionPattern=[%d{HH:mm:ss}] %p [%c] - %m%n
+
+log4j.appender.stdout.layout.ConversionPattern=[%d{HH:mm:ss}] %p [%c] - %m%n
+
+# with these we'll not get innundated when switching to DEBUG
+log4j.logger.org.apache.mina=WARN
+log4j.logger.org.apache.directory.server.config=WARN
+log4j.logger.org.apache.directory.shared.asn1=WARN
+log4j.logger.org.apache.directory.shared.ldap.codec=WARN
+
+log4j.logger.org.apache.directory.shared.ldap.name=FATAL
+log4j.logger.org.apache.directory.shared.codec=FATAL
+log4j.logger.org.apache.directory.server.schema.registries=FATAL
+log4j.logger.org.apache.directory.shared.ldap.schema=WARN
+log4j.logger.org.apache.directory.shared.ldap.ldif=WARN
+log4j.logger.org.apache.directory.ldap.client.api=WARN
+log4j.logger.JdbmTable=WARN
+log4j.logger.JdbmIndex=WARN
+log4j.logger.LOG_CHANGES=WARN
+log4j.logger.org.apache.directory.server.core.partition.impl.btree.jdbm=WARN
+log4j.logger.org.apache.directory.server.core.DefaultOperationManager=WARN
+log4j.logger.org.apache.directory.server.core.partition.ldif=WARN
+log4j.logger.org.apache.directory.server.core.security.TlsKeyGenerator=WARN
+log4j.logger.org.apache.directory.shared.ldap.entry.StringValue=WARN
+log4j.logger.aci-logger=WARN
+log4j.logger.org.apache.directory.shared.ldap.subtree=WARN
+log4j.logger.org.apache.directory.shared.ldap.aci=WARN
+log4j.logger.org.apache.directory.server.xdbm.impl.avl=WARN
+log4j.logger.org.apache.directory.server.ldap=WARN
+log4j.logger.org.apache.activemq=WARN
\ No newline at end of file
