diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..9f309ff
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "lib/plexi"]
+	path = lib/plexi
+	url = https://code.google.com/p/plexi/
diff --git a/build.xml b/build.xml
index a91cd6c..e4a5e70 100644
--- a/build.xml
+++ b/build.xml
@@ -188,7 +188,7 @@
       <fileset dir="${lib.dir}" includes="${tmp.adaptor.fileset}"/>
     </copy>
 
-    <!-- adaptor-ad-withlib.jar -->
+    <!-- adaptor-ldap-withlib.jar -->
     <jar filesetmanifest="mergewithoutmain"
       destfile="${dist.staging.dir}/adaptor-ldap${adaptor.suffix}-withlib.jar">
       <zipfileset
diff --git a/lib/JUnitLogFixFormatter.java b/lib/JUnitLogFixFormatter.java
new file mode 100644
index 0000000..415355e
--- /dev/null
+++ b/lib/JUnitLogFixFormatter.java
@@ -0,0 +1,109 @@
+// Copyright 2013 Google Inc. All Rights Reserved.
+//
+// Licensed 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.
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter;
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitTest;
+
+import java.io.*;
+import java.util.*;
+import java.util.logging.*;
+
+/**
+ * Ant formatter for fixing logging output when runing multiple JUnit tests in
+ * the same JVM.
+ *
+ * <p>The default {@link ConsoleHandler} caches the value of {@code System.err}.
+ * The Ant task changes {@code System.err} after every test. Thus, only the
+ * first test gets logging logged when running JUnit tests from Ant. This
+ * formatter changes swaps out any ConsoleHandlers with new console handlers
+ * that have the correct {@code System.err} reference, and the swaps them back
+ * after the test is over.
+ */
+public class JUnitLogFixFormatter implements JUnitResultFormatter {
+  private List<ConsoleHandler> removedHandlers
+      = new ArrayList<ConsoleHandler>();
+  private List<ConsoleHandler> addedHandlers = new ArrayList<ConsoleHandler>();
+
+  @Override
+  public void startTestSuite(JUnitTest suite) throws BuildException {
+    if (removedHandlers.size() != 0) {
+      throw new IllegalStateException("removedHandlers must be empty");
+    }
+    if (addedHandlers.size() != 0) {
+      throw new IllegalStateException("addedHandlers must be empty");
+    }
+
+    Logger root = Logger.getLogger("");
+    for (Handler handler : root.getHandlers()) {
+      if (handler instanceof ConsoleHandler) {
+        removedHandlers.add((ConsoleHandler) handler);
+      }
+    }
+
+    for (ConsoleHandler oldHandler : removedHandlers) {
+      ConsoleHandler newHandler = new ConsoleHandler();
+      newHandler.setLevel(oldHandler.getLevel());
+      newHandler.setFilter(oldHandler.getFilter());
+      newHandler.setFormatter(oldHandler.getFormatter());
+      try {
+        newHandler.setEncoding(oldHandler.getEncoding());
+      } catch (UnsupportedEncodingException ex) {
+        throw new IllegalStateException(ex);
+      }
+      newHandler.setErrorManager(oldHandler.getErrorManager());
+      root.addHandler(newHandler);
+      addedHandlers.add(newHandler);
+      root.removeHandler(oldHandler);
+    }
+  }
+
+  @Override
+  public void endTestSuite(JUnitTest suite) throws BuildException {
+    Logger root = Logger.getLogger("");
+    for (ConsoleHandler handler : removedHandlers) {
+      root.addHandler(handler);
+    }
+    removedHandlers.clear();
+
+    for (ConsoleHandler handler : addedHandlers) {
+      root.removeHandler(handler);
+    }
+    addedHandlers.clear();
+  }
+
+  @Override
+  public void setOutput(OutputStream out) {}
+
+  @Override
+  public void setSystemError(String err) {}
+
+  @Override
+  public void setSystemOutput(String out) {}
+
+  @Override
+  public void addError(Test test, Throwable t) {}
+
+  @Override
+  public void addFailure(Test test, AssertionFailedError t) {}
+
+  @Override
+  public void endTest(Test test) {}
+
+  @Override
+  public void startTest(Test test) {}
+}
diff --git a/lib/junit-4.8.2.jar b/lib/junit-4.8.2.jar
new file mode 100644
index 0000000..5b4bb84
--- /dev/null
+++ b/lib/junit-4.8.2.jar
Binary files differ
diff --git a/lib/plexi b/lib/plexi
new file mode 160000
index 0000000..a0ceeba
--- /dev/null
+++ b/lib/plexi
@@ -0,0 +1 @@
+Subproject commit a0ceeba4a0c9eba529446a8b8995488a8c441dc9
diff --git a/logging.properties b/logging.properties
new file mode 100644
index 0000000..3cc9074
--- /dev/null
+++ b/logging.properties
@@ -0,0 +1,9 @@
+handlers = java.util.logging.ConsoleHandler
+.level = INFO
+com.google.enterprise.adaptor.ldap.LdapAdaptor.level = FINER
+com.google.enterprise.adaptor.level = FINER
+java.util.logging.ConsoleHandler.level = FINEST
+java.util.logging.ConsoleHandler.formatter = com.google.enterprise.adaptor.CustomFormatter
+# Uncomment if your terminal can't handle colors and the auto-detection
+# is incorrect.
+# com.google.enterprise.adaptor.CustomFormatter.useColor = false
diff --git a/src/com/google/enterprise/adaptor/ldap/LdapAdaptor.java b/src/com/google/enterprise/adaptor/ldap/LdapAdaptor.java
new file mode 100644
index 0000000..c9c6a0f
--- /dev/null
+++ b/src/com/google/enterprise/adaptor/ldap/LdapAdaptor.java
@@ -0,0 +1,49 @@
+// Copyright 2014 Google Inc. All Rights Reserved.
+//
+// Licensed 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 com.google.enterprise.adaptor.ldap;
+
+import com.google.enterprise.adaptor.AbstractAdaptor;
+import com.google.enterprise.adaptor.AdaptorContext;
+import com.google.enterprise.adaptor.Config;
+import com.google.enterprise.adaptor.DocId;
+import com.google.enterprise.adaptor.DocIdPusher;
+import com.google.enterprise.adaptor.Request;
+import com.google.enterprise.adaptor.Response;
+
+/** For getting LDAP content (not just ACLs) into a Google Search Appliance. */
+public class LdapAdaptor extends AbstractAdaptor {
+
+  public static void main(String[] args) {
+    AbstractAdaptor.main(new LdapAdaptor(), args);
+  }
+
+  @Override
+  public void initConfig(Config config) {
+  }
+
+  @Override
+  public void init(AdaptorContext context) throws Exception {
+  }
+
+  /** Get all doc ids from LDAP. */
+  @Override
+  public void getDocIds(DocIdPusher pusher) {
+  }
+
+  /** Gives the bytes of a document referenced with id. */
+  @Override
+  public void getDocContent(Request req, Response resp) {
+  }
+}
diff --git a/test/com/google/enterprise/adaptor/ldap/LdapAdaptorTest.java b/test/com/google/enterprise/adaptor/ldap/LdapAdaptorTest.java
new file mode 100644
index 0000000..5731be8
--- /dev/null
+++ b/test/com/google/enterprise/adaptor/ldap/LdapAdaptorTest.java
@@ -0,0 +1,34 @@
+// Copyright 2014 Google Inc. All Rights Reserved.
+//
+// Licensed 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 com.google.enterprise.adaptor.ldap;
+
+import static org.junit.Assert.*;
+
+import org.junit.*;
+import org.junit.rules.ExpectedException;
+
+import org.junit.Test;
+import java.util.ArrayList;
+import java.util.List;
+
+public class LdapAdaptorTest {
+  @Rule
+  public ExpectedException thrown = ExpectedException.none();
+
+  @Test
+  public void testAbsolutelyNothing() {
+    // throw new RuntimeException("add test here");
+  }
+}
