diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 7113912..9226a00 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -8,6 +8,9 @@
 	<body>
 	    <release version="1.9-SNAPSHOT" date="in Mercurial" description="Development">
             <action dev="py4fun" type="remove" issue="124">
+                Remove deprecated JavaBeanParser (2011-07-05)
+            </action>
+            <action dev="py4fun" type="remove" issue="124">
                 Remove redundant JavaBeanDumper.classTags set (2011-07-03)
             </action>
             <action dev="py4fun" type="add" issue="124">
diff --git a/src/main/java/org/yaml/snakeyaml/JavaBeanParser.java b/src/main/java/org/yaml/snakeyaml/JavaBeanParser.java
deleted file mode 100644
index e1185ef..0000000
--- a/src/main/java/org/yaml/snakeyaml/JavaBeanParser.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * Copyright (c) 2008-2011, http://www.snakeyaml.org
- *
- * 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 org.yaml.snakeyaml;
-
-import java.io.InputStream;
-import java.io.Reader;
-
-/**
- * Convenience utility to parse JavaBeans. The returned instance is enforced to
- * be of the same class as the provided argument. All the methods are Thread
- * safe. When the YAML document contains a global tag with the class definition
- * like '!!com.package.MyBean' it is ignored in favour of the runtime class.
- * 
- * @deprecated use JavaBeanLoader instead
- */
-public class JavaBeanParser {
-
-    private JavaBeanParser() {
-    }
-
-    /**
-     * Parse the first YAML document in a stream and produce the corresponding
-     * JavaBean.
-     * 
-     * @param yaml
-     *            YAML document
-     * @param javabean
-     *            JavaBean class to be parsed
-     * @return parsed JavaBean
-     */
-    public static <T> T load(String yaml, Class<T> javabean) {
-        JavaBeanLoader<T> loader = new JavaBeanLoader<T>(javabean);
-        return loader.load(yaml);
-    }
-
-    /**
-     * Parse the first YAML document in a stream and produce the corresponding
-     * JavaBean.
-     * 
-     * @param io
-     *            data to load from (BOM is respected and removed)
-     * @param javabean
-     *            JavaBean class to be parsed
-     * @return parsed JavaBean
-     */
-    public static <T> T load(InputStream io, Class<T> javabean) {
-        JavaBeanLoader<T> loader = new JavaBeanLoader<T>(javabean);
-        return loader.load(io);
-    }
-
-    /**
-     * Parse the first YAML document in a stream and produce the corresponding
-     * Java object.
-     * 
-     * @param io
-     *            data to load from (BOM must not be present)
-     * @param javabean
-     *            JavaBean class to be parsed
-     * @return parsed JavaBean
-     */
-    public static <T> T load(Reader io, Class<T> javabean) {
-        JavaBeanLoader<T> loader = new JavaBeanLoader<T>(javabean);
-        return loader.load(io);
-    }
-}
diff --git a/src/test/java/org/yaml/snakeyaml/JavaBeanParserTest.java b/src/test/java/org/yaml/snakeyaml/JavaBeanParserTest.java
deleted file mode 100644
index d31f865..0000000
--- a/src/test/java/org/yaml/snakeyaml/JavaBeanParserTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * Copyright (c) 2008-2011, http://www.snakeyaml.org
- *
- * 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 org.yaml.snakeyaml;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.Reader;
-import java.io.StringReader;
-
-import junit.framework.TestCase;
-
-public class JavaBeanParserTest extends TestCase {
-
-    @SuppressWarnings("deprecation")
-    public void testLoadString() {
-        Bean bean = new Bean();
-        bean.setId(3);
-        bean.setName("Test me.");
-        Yaml yaml = new Yaml();
-        String output = yaml.dump(bean);
-        assertEquals("!!org.yaml.snakeyaml.JavaBeanParserTest$Bean {id: 3, name: Test me.}\n",
-                output);
-        Bean parsed = JavaBeanParser.load(output, Bean.class);
-        assertEquals(3, parsed.getId());
-        assertEquals("Test me.", parsed.getName());
-        // Runtime definition is more important
-        Bean2 parsed2 = JavaBeanParser.load(output, Bean2.class);
-        assertEquals(3, parsed2.getId());
-        assertEquals("Test me.", parsed2.getName());
-        assertFalse(parsed2.isValid());
-    }
-
-    @SuppressWarnings("deprecation")
-    public void testLoadInputStream() {
-        String yaml = "!!org.yaml.snakeyaml.JavaBeanParserTest$Bean {id: 3, name: Test me.}\n";
-        InputStream input = new ByteArrayInputStream(yaml.getBytes());
-        Bean parsed = JavaBeanParser.load(input, Bean.class);
-        assertEquals(3, parsed.getId());
-        assertEquals("Test me.", parsed.getName());
-    }
-
-    @SuppressWarnings("deprecation")
-    public void testLoadReader() {
-        String yaml = "!!org.yaml.snakeyaml.JavaBeanParserTest$Bean {id: 3, name: Test me.}\n";
-        Reader input = new StringReader(yaml);
-        Bean parsed = JavaBeanParser.load(input, Bean.class);
-        assertEquals(3, parsed.getId());
-        assertEquals("Test me.", parsed.getName());
-    }
-
-    public static class Bean {
-        private String name;
-        private int id;
-
-        public String getName() {
-            return name;
-        }
-
-        public void setName(String name) {
-            this.name = name;
-        }
-
-        public int getId() {
-            return id;
-        }
-
-        public void setId(int id) {
-            this.id = id;
-        }
-    }
-
-    public static class Bean2 {
-        private String name;
-        private int id;
-        private boolean valid;
-
-        public String getName() {
-            return name;
-        }
-
-        public void setName(String name) {
-            this.name = name;
-        }
-
-        public int getId() {
-            return id;
-        }
-
-        public void setId(int id) {
-            this.id = id;
-        }
-
-        public boolean isValid() {
-            return valid;
-        }
-
-        public void setValid(boolean valid) {
-            this.valid = valid;
-        }
-    }
-}
