diff --git a/CHANGES.txt b/CHANGES.txt
deleted file mode 100644
index 0826b90..0000000
--- a/CHANGES.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-Horn Change Log
-
-Release 0.1.0 (unreleased changes)
-
-  NEW FEATURES
-
-    HORN-1: Website for Apache Horn (Incubating) (Elmurod Talipov via edwardyoon)
-    
-  BUG FIXES
-
-  IMPROVEMENTS
diff --git a/src/main/java/org/apache/horn/distbelief/DistBeliefModelTrainer.java b/src/main/java/org/apache/horn/distbelief/DistBeliefModelTrainer.java
deleted file mode 100644
index c7326ab..0000000
--- a/src/main/java/org/apache/horn/distbelief/DistBeliefModelTrainer.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.apache.horn.distbelief;
-
-import java.io.IOException;
-
-import org.apache.hama.bsp.BSP;
-import org.apache.hama.bsp.BSPPeer;
-import org.apache.hama.bsp.sync.SyncException;
-
-/**
- * This DistBeliefModelTrainer performs each SGD. 
- */
-public class DistBeliefModelTrainer extends BSP {
-
-  private boolean isConverge = false;
-  private int iterations;
-  private int maxIterations;
-  
-  @Override
-  public final void setup(BSPPeer peer) {
-    // loads subset of neural network model replica into memory
-  }
-  
-  @Override
-  public void bsp(BSPPeer peer) throws IOException, SyncException,
-      InterruptedException {
-
-    // Iterate until reach max iteration or convergence
-    while (this.iterations++ < maxIterations) {
-      
-      // Fetch latest parameters
-      fetchParameters(peer);
-      
-      // Perform mini-batch
-      doMinibatch(peer);
-      
-      // Push parameters
-      pushParameters(peer);
-      
-      if (this.isConverge) {
-        break;
-      }
-    }
-    
-  }
-
-  /**
-   * Performs the mini-batch
-   * @param peer
-   */
-  private void doMinibatch(BSPPeer peer) {
-    double avgTrainingError = 0.0;
-    // 1. loads a next set of mini-batch instances from assigned splits into memory
-    
-    // 2. train incrementally from a mini-batch of instances
-    /*
-    for (Instance trainingInstance : MiniBatchSet) {
-      
-      // 2.1 upward propagation (start from the input layer)
-      for (Neuron neuron : neurons) {  
-        neuron.upward(msg);
-        sync();
-      }
-        
-      // 2.2 calculate total error
-      sync();
-      
-      // 2.3 downward propagation (start from the total error)
-      for (Neuron neuron : neurons) {  
-        neuron.downward(msg);
-        sync();
-      }
-    
-    }
-    // calculate the the average training error
-    */
-    
-  }
-  
-  private void fetchParameters(BSPPeer peer) {
-    // TODO fetch latest weights from the parameter server
-  }
-
-  private void pushParameters(BSPPeer peer) {
-    // TODO push updated weights
-  }
-
-}
diff --git a/src/main/java/org/apache/horn/distbelief/Neuron.java b/src/main/java/org/apache/horn/distbelief/Neuron.java
deleted file mode 100644
index fadb522..0000000
--- a/src/main/java/org/apache/horn/distbelief/Neuron.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * 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.horn.distbelief;
-
-import org.apache.hadoop.io.Writable;
-
-public abstract class Neuron<M extends Writable> implements NeuronInterface<M> {
-  double output;
-  double weight;
-
-  public void propagate(double gradient) {
-    // TODO Auto-generated method stub
-  }
-
-  public void setOutput(double output) {
-    this.output = output;
-  }
-
-  public double getOutput() {
-    return output;
-  }
-
-  public void push(double weight) {
-    // TODO Auto-generated method stub
-    this.weight = weight;
-  }
-
-  public double getUpdate() {
-    return weight;
-  }
-
-}
diff --git a/src/main/java/org/apache/horn/distbelief/NeuronInterface.java b/src/main/java/org/apache/horn/distbelief/NeuronInterface.java
deleted file mode 100644
index 8093b07..0000000
--- a/src/main/java/org/apache/horn/distbelief/NeuronInterface.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * 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.horn.distbelief;
-
-import java.io.IOException;
-
-import org.apache.hadoop.io.Writable;
-
-public interface NeuronInterface<M extends Writable> {
-
-  /**
-   * This method is called when the messages are propagated from the lower
-   * layer. It can be used to determine if the neuron would activate, or fire.
-   * 
-   * @param messages
-   * @throws IOException
-   */
-  public void upward(Iterable<M> messages) throws IOException;
-
-  /**
-   * This method is called when the errors are propagated from the upper layer.
-   * It can be used to calculate the error of each neuron and change the
-   * weights.
-   * 
-   * @param messages
-   * @throws IOException
-   */
-  public void downward(Iterable<M> messages) throws IOException;
-  
-}
diff --git a/src/main/java/org/apache/horn/distbelief/PropMessage.java b/src/main/java/org/apache/horn/distbelief/PropMessage.java
deleted file mode 100644
index 029cd6a..0000000
--- a/src/main/java/org/apache/horn/distbelief/PropMessage.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * 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.horn.distbelief;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-
-import org.apache.hadoop.io.Writable;
-
-/**
- * Message wrapper for a propagating message
- */
-public class PropMessage<M extends Writable, W extends Writable> implements
-    Writable {
-
-  M message;
-  W weight;
-
-  public PropMessage(M message, W weight) {
-    this.message = message;
-    this.weight = weight;
-  }
-
-  /**
-   * @return the activation or error message
-   */
-  public M getMessage() {
-    return message;
-  }
-
-  public W getWeight() {
-    return weight;
-  }
-
-  @Override
-  public void readFields(DataInput in) throws IOException {
-    message.readFields(in);
-    weight.readFields(in);
-  }
-
-  @Override
-  public void write(DataOutput out) throws IOException {
-    message.write(out);
-    weight.write(out);
-  }
-
-}
diff --git a/src/test/java/org/apache/horn/distbelief/TestDistBeliefModelTrainer.java b/src/test/java/org/apache/horn/distbelief/TestDistBeliefModelTrainer.java
deleted file mode 100644
index 5bbd90c..0000000
--- a/src/test/java/org/apache/horn/distbelief/TestDistBeliefModelTrainer.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.apache.horn.distbelief;
-
-public class TestDistBeliefModelTrainer {
-
-}
diff --git a/src/test/java/org/apache/horn/distbelief/TestNeuron.java b/src/test/java/org/apache/horn/distbelief/TestNeuron.java
deleted file mode 100644
index 9af1315..0000000
--- a/src/test/java/org/apache/horn/distbelief/TestNeuron.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * 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.horn.distbelief;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.apache.hadoop.io.DoubleWritable;
-import org.apache.hama.commons.math.Sigmoid;
-
-public class TestNeuron extends TestCase {
-  private static double learningRate = 0.1;
-  private static double bias = -1;
-  private static double theta = 0.8;
-
-  public static class MyNeuron extends
-      Neuron<PropMessage<DoubleWritable, DoubleWritable>> {
-
-    @Override
-    public void upward(
-        Iterable<PropMessage<DoubleWritable, DoubleWritable>> messages)
-        throws IOException {
-      double sum = 0;
-      for (PropMessage<DoubleWritable, DoubleWritable> m : messages) {
-        sum += m.getMessage().get() * m.getWeight().get();
-      }
-      sum += (bias * theta);
-
-      double output = new Sigmoid().apply(sum);
-      this.setOutput(output);
-      this.propagate(output);
-    }
-
-    @Override
-    public void downward(
-        Iterable<PropMessage<DoubleWritable, DoubleWritable>> messages)
-        throws IOException {
-      for (PropMessage<DoubleWritable, DoubleWritable> m : messages) {
-        // Calculates error gradient for each neuron
-        double gradient = this.getOutput() * (1 - this.getOutput())
-            * m.getMessage().get() * m.getWeight().get();
-
-        // Propagates to lower layer
-        this.propagate(gradient);
-
-        // Weight corrections
-        double weight = learningRate * this.getOutput() * m.getMessage().get();
-        this.push(weight);
-      }
-    }
-
-  }
-
-  public void testProp() throws IOException {
-    List<PropMessage<DoubleWritable, DoubleWritable>> x = new ArrayList<PropMessage<DoubleWritable, DoubleWritable>>();
-    x.add(new PropMessage<DoubleWritable, DoubleWritable>(new DoubleWritable(
-        1.0), new DoubleWritable(0.5)));
-    x.add(new PropMessage<DoubleWritable, DoubleWritable>(new DoubleWritable(
-        1.0), new DoubleWritable(0.4)));
-
-    MyNeuron n = new MyNeuron();
-    n.upward(x);
-    assertEquals(0.5249791874789399, n.getOutput());
-
-    x.clear();
-    x.add(new PropMessage<DoubleWritable, DoubleWritable>(new DoubleWritable(
-        -0.1274), new DoubleWritable(-1.2)));
-    n.downward(x);
-    assertEquals(-0.006688234848481696, n.getUpdate());
-  }
-  
-}
