diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 49206e6..21cea00 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -6,6 +6,11 @@
 		<author email="py4fun@gmail.com">Andrey Somov</author>
 	</properties>
 	<body>
+	      <release version="1.8-SNAPSHOT" date="in Mercurial" description="development">
+            <action dev="py4fun" type="remove">
+                Cleanup unused code in deprecated Loader and Dumper (2010-08-13)
+            </action>
+          </release>
           <release version="1.7" date="2010-08-12" description="Simplify public API (drop Loader and Dumper)">
             <action dev="py4fun" type="update">
                 Eclipse does not run JUnit 4 tests when they are launched for the whole project (2010-08-11)
diff --git a/src/main/java/org/yaml/snakeyaml/Dumper.java b/src/main/java/org/yaml/snakeyaml/Dumper.java
index 23574bc..29f8160 100644
--- a/src/main/java/org/yaml/snakeyaml/Dumper.java
+++ b/src/main/java/org/yaml/snakeyaml/Dumper.java
@@ -16,29 +16,17 @@
 
 package org.yaml.snakeyaml;
 
-import java.io.Writer;
-import java.util.Iterator;
-
-import org.yaml.snakeyaml.emitter.Emitter;
-import org.yaml.snakeyaml.error.YAMLException;
 import org.yaml.snakeyaml.representer.Representer;
-import org.yaml.snakeyaml.resolver.Resolver;
-import org.yaml.snakeyaml.serializer.Serializer;
 
 /**
  * @deprecated Dumper's functionality was moved to Yaml
  */
-public class Dumper {
+public final class Dumper {
     protected final Representer representer;
     protected final DumperOptions options;
-    private boolean attached = false;
 
     public Dumper(Representer representer, DumperOptions options) {
         this.representer = representer;
-        representer.setDefaultFlowStyle(options.getDefaultFlowStyle());
-        representer.setDefaultScalarStyle(options.getDefaultScalarStyle());
-        representer.getPropertyUtils().setAllowReadOnlyProperties(
-                options.isAllowReadOnlyProperties());
         this.options = options;
     }
 
@@ -53,28 +41,4 @@
     public Dumper() {
         this(new Representer(), new DumperOptions());
     }
-
-    public void dump(Iterator<? extends Object> iter, Writer output, Resolver resolver) {
-        Serializer s = new Serializer(new Emitter(output, options), resolver, options);
-        try {
-            s.open();
-            while (iter.hasNext()) {
-                representer.represent(s, iter.next());
-            }
-            s.close();
-        } catch (java.io.IOException e) {
-            throw new YAMLException(e);
-        }
-    }
-
-    /**
-     * Because Dumper is stateful it cannot be shared
-     */
-    void setAttached() {
-        if (!attached) {
-            attached = true;
-        } else {
-            throw new YAMLException("Dumper cannot be shared.");
-        }
-    }
 }
diff --git a/src/main/java/org/yaml/snakeyaml/Loader.java b/src/main/java/org/yaml/snakeyaml/Loader.java
index 7d90ade..fadb257 100644
--- a/src/main/java/org/yaml/snakeyaml/Loader.java
+++ b/src/main/java/org/yaml/snakeyaml/Loader.java
@@ -16,28 +16,16 @@
 
 package org.yaml.snakeyaml;
 
-import java.io.Reader;
-import java.util.Iterator;
-
-import org.yaml.snakeyaml.composer.Composer;
 import org.yaml.snakeyaml.constructor.BaseConstructor;
 import org.yaml.snakeyaml.constructor.Constructor;
-import org.yaml.snakeyaml.error.YAMLException;
-import org.yaml.snakeyaml.events.Event;
-import org.yaml.snakeyaml.introspector.BeanAccess;
-import org.yaml.snakeyaml.nodes.Node;
-import org.yaml.snakeyaml.parser.Parser;
-import org.yaml.snakeyaml.parser.ParserImpl;
-import org.yaml.snakeyaml.reader.StreamReader;
 import org.yaml.snakeyaml.resolver.Resolver;
 
 /**
  * @deprecated Loader's functionality was moved to Yaml
  */
-public class Loader {
+public final class Loader {
     protected final BaseConstructor constructor;
     protected Resolver resolver;
-    private boolean attached = false;
 
     public Loader(BaseConstructor constructor) {
         super();
@@ -47,152 +35,4 @@
     public Loader() {
         this(new Constructor());
     }
-
-    public void setBeanAccess(BeanAccess beanAccess) {
-        constructor.getPropertyUtils().setBeanAccess(beanAccess);
-    }
-
-    public Object load(Reader io) {
-        Composer composer = new Composer(new ParserImpl(new StreamReader(io)), resolver);
-        constructor.setComposer(composer);
-        return constructor.getSingleData();
-    }
-
-    public Iterable<Object> loadAll(Reader yaml) {
-        Composer composer = new Composer(new ParserImpl(new StreamReader(yaml)), resolver);
-        this.constructor.setComposer(composer);
-        Iterator<Object> result = new Iterator<Object>() {
-            public boolean hasNext() {
-                return constructor.checkData();
-            }
-
-            public Object next() {
-                return constructor.getData();
-            }
-
-            public void remove() {
-                throw new UnsupportedOperationException();
-            }
-        };
-        return new YamlIterable(result);
-    }
-
-    /**
-     * Parse the first YAML document in a stream and produce the corresponding
-     * representation tree.
-     * 
-     * @param yaml
-     *            YAML document
-     * @return parsed root Node for the specified YAML document
-     */
-    public Node compose(Reader yaml) {
-        Composer composer = new Composer(new ParserImpl(new StreamReader(yaml)), resolver);
-        this.constructor.setComposer(composer);
-        return composer.getSingleNode();
-    }
-
-    /**
-     * Parse all YAML documents in a stream and produce corresponding
-     * representation trees.
-     * 
-     * @param yaml
-     *            stream of YAML documents
-     * @return parsed root Nodes for all the specified YAML documents
-     */
-    public Iterable<Node> composeAll(Reader yaml) {
-        final Composer composer = new Composer(new ParserImpl(new StreamReader(yaml)), resolver);
-        this.constructor.setComposer(composer);
-        Iterator<Node> result = new Iterator<Node>() {
-            public boolean hasNext() {
-                return composer.checkNode();
-            }
-
-            public Node next() {
-                return composer.getNode();
-            }
-
-            public void remove() {
-                throw new UnsupportedOperationException();
-            }
-        };
-        return new NodeIterable(result);
-    }
-
-    private class NodeIterable implements Iterable<Node> {
-        private Iterator<Node> iterator;
-
-        public NodeIterable(Iterator<Node> iterator) {
-            this.iterator = iterator;
-        }
-
-        public Iterator<Node> iterator() {
-            return iterator;
-        }
-
-    }
-
-    private class YamlIterable implements Iterable<Object> {
-        private Iterator<Object> iterator;
-
-        public YamlIterable(Iterator<Object> iterator) {
-            this.iterator = iterator;
-        }
-
-        public Iterator<Object> iterator() {
-            return iterator;
-        }
-
-    }
-
-    public void setResolver(Resolver resolver) {
-        this.resolver = resolver;
-    }
-
-    /**
-     * Because Loader is stateful it cannot be shared
-     */
-    void setAttached() {
-        if (!attached) {
-            attached = true;
-        } else {
-            throw new YAMLException("Loader cannot be shared.");
-        }
-    }
-
-    /**
-     * Parse a YAML stream and produce parsing events.
-     * 
-     * @param yaml
-     *            YAML document(s)
-     * @return parsed events
-     */
-    public Iterable<Event> parse(Reader yaml) {
-        final Parser parser = new ParserImpl(new StreamReader(yaml));
-        Iterator<Event> result = new Iterator<Event>() {
-            public boolean hasNext() {
-                return parser.peekEvent() != null;
-            }
-
-            public Event next() {
-                return parser.getEvent();
-            }
-
-            public void remove() {
-                throw new UnsupportedOperationException();
-            }
-        };
-        return new EventIterable(result);
-    }
-
-    private class EventIterable implements Iterable<Event> {
-        private Iterator<Event> iterator;
-
-        public EventIterable(Iterator<Event> iterator) {
-            this.iterator = iterator;
-        }
-
-        public Iterator<Event> iterator() {
-            return iterator;
-        }
-    }
 }
