diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 4178922..4c23768 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,6 +7,11 @@
 	</properties>
 	<body>
 	     <release version="1.4-SNAPSHOT" date="in Mercurial" description="development">
+	         <action dev="py4fun" type="fix" issue="9" due-to="wwagner4">
+                Fix: Bean with no property cannot be instantiated. This is implemented via better
+                support for immutable objects. Custom Constructor may be used when there are more
+                then 1 way to create an instance (2009-08-04)
+            </action>
 	        <action dev="py4fun" type="add">
                 Deliver possibility to load immutable instances with no global tags. Reflection for
                 constructor arguments is used to get the runtime classes (2009-08-04)
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
index e805199..24e16f8 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java
@@ -293,7 +293,7 @@
      * Construct scalar instance when the runtime class is known. Recursive
      * structures are not supported.
      */
-    private class ConstructScalar extends AbstractConstruct {
+    protected class ConstructScalar extends AbstractConstruct {
         @SuppressWarnings("unchecked")
         public Object construct(Node nnode) {
             ScalarNode node = (ScalarNode) nnode;
@@ -488,7 +488,7 @@
         }
     }
 
-    private Class<?> getClassForNode(Node node) throws ClassNotFoundException {
+    protected Class<?> getClassForNode(Node node) throws ClassNotFoundException {
         Class<? extends Object> customTag = typeTags.get(node.getTag());
         if (customTag == null) {
             if (node.getTag().length() < Tags.PREFIX.length()) {
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue9/Bean1.java b/src/test/java/org/yaml/snakeyaml/issues/issue9/Bean1.java
new file mode 100644
index 0000000..6ed0baf
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue9/Bean1.java
@@ -0,0 +1,43 @@
+package org.yaml.snakeyaml.issues.issue9;
+
+import org.springframework.core.style.ToStringCreator;
+
+public class Bean1 implements IBean {
+
+    private String strVal = "BEAN_1";
+
+    private int intVal = 1;
+
+    public Bean1() {
+        super();
+    }
+
+    public Bean1(int intVal) {
+        this.intVal = intVal;
+    }
+
+    public String getStrVal() {
+        return strVal;
+    }
+
+    public void setStrVal(String strVal) {
+        this.strVal = strVal;
+    }
+
+    public int getIntVal() {
+        return intVal;
+    }
+
+    public void setIntVal(int intVal) {
+        this.intVal = intVal;
+    }
+
+    @Override
+    public String toString() {
+        ToStringCreator builder = new ToStringCreator(this);
+        builder.append(this.strVal);
+        builder.append(this.intVal);
+        return builder.toString();
+    }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue9/Bean2.java b/src/test/java/org/yaml/snakeyaml/issues/issue9/Bean2.java
new file mode 100644
index 0000000..0deb141
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue9/Bean2.java
@@ -0,0 +1,39 @@
+package org.yaml.snakeyaml.issues.issue9;
+
+import org.springframework.core.style.ToStringCreator;
+
+public class Bean2 implements IBean {
+
+	private String strVal = "BEAN_2";
+
+	private int intVal = 2;
+
+	public Bean2() {
+		super();
+	}
+
+	public String getStrVal() {
+		return strVal;
+	}
+
+	public void setStrVal(String strVal) {
+		this.strVal = strVal;
+	}
+
+	public int getIntVal() {
+		return intVal;
+	}
+
+	public void setIntVal(int intVal) {
+		this.intVal = intVal;
+	}
+
+	@Override
+	public String toString() {
+		ToStringCreator builder = new ToStringCreator(this);
+		builder.append(this.strVal);
+		builder.append(this.intVal);
+		return builder.toString();
+	}
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue9/BeanConstructor.java b/src/test/java/org/yaml/snakeyaml/issues/issue9/BeanConstructor.java
new file mode 100644
index 0000000..93748ee
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue9/BeanConstructor.java
@@ -0,0 +1,36 @@
+package org.yaml.snakeyaml.issues.issue9;
+
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.error.YAMLException;
+import org.yaml.snakeyaml.nodes.Node;
+import org.yaml.snakeyaml.nodes.NodeId;
+import org.yaml.snakeyaml.nodes.ScalarNode;
+
+public class BeanConstructor extends Constructor {
+
+    public BeanConstructor() {
+        super(BeanHolder.class);
+        yamlClassConstructors.put(NodeId.scalar, new BeanScalarConstructor());
+    }
+
+    private class BeanScalarConstructor extends ConstructScalar {
+        @Override
+        public Object construct(Node node) {
+            ScalarNode snode = (ScalarNode) node;
+            if (BeanHolder.class.equals(node.getType()) || IBean.class.equals(node.getType())) {
+                if (snode.getValue().length() == 0) {
+                    try {
+                        return getClassForNode(node).newInstance();
+                    } catch (Exception e) {
+                        throw new YAMLException("BeanHolder cannot be created");
+                    }
+                } else {
+                    throw new YAMLException("BeanHolder cannot be created out of '"
+                            + snode.getValue() + "'");
+                }
+            } else {
+                return super.construct(node);
+            }
+        }
+    }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue9/BeanHolder.java b/src/test/java/org/yaml/snakeyaml/issues/issue9/BeanHolder.java
new file mode 100644
index 0000000..2e652a8
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue9/BeanHolder.java
@@ -0,0 +1,33 @@
+package org.yaml.snakeyaml.issues.issue9;
+
+import org.springframework.core.style.ToStringCreator;
+
+public class BeanHolder {
+
+    private IBean bean = new Bean1();
+
+    public BeanHolder() {
+        super();
+    }
+
+    public BeanHolder(IBean bean) {
+        super();
+        this.bean = bean;
+    }
+
+    public IBean getBean() {
+        return bean;
+    }
+
+    public void setBean(IBean bean) {
+        this.bean = bean;
+    }
+
+    @Override
+    public String toString() {
+        ToStringCreator builder = new ToStringCreator(this);
+        builder.append(this.bean);
+        return builder.toString();
+    }
+
+}
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue9/IBean.java b/src/test/java/org/yaml/snakeyaml/issues/issue9/IBean.java
new file mode 100644
index 0000000..c7a7ad9
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue9/IBean.java
@@ -0,0 +1,13 @@
+package org.yaml.snakeyaml.issues.issue9;
+
+public interface IBean {
+
+	public abstract String getStrVal();
+
+	public abstract void setStrVal(String strVal);
+
+	public abstract int getIntVal();
+
+	public abstract void setIntVal(int intVal);
+
+}
\ No newline at end of file
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue9/NopropTestCase.java b/src/test/java/org/yaml/snakeyaml/issues/issue9/NopropTestCase.java
new file mode 100644
index 0000000..97da4f9
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue9/NopropTestCase.java
@@ -0,0 +1,103 @@
+package org.yaml.snakeyaml.issues.issue9;
+
+import java.util.Iterator;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.Yaml;
+
+public class NopropTestCase extends TestCase {
+
+    public void testOK01() {
+        String yaml = "--- !!org.yaml.snakeyaml.issues.issue9.BeanHolder\nbean : !!org.yaml.snakeyaml.issues.issue9.Bean1\n  intVal : 11\n  strVal : HALLO_1 ";
+        Iterator<Object> docs = new Yaml().loadAll(yaml).iterator();
+        assertTrue(docs.hasNext());
+        BeanHolder beanHolder = (BeanHolder) docs.next();
+        assertEquals("HALLO_1", beanHolder.getBean().getStrVal());
+        assertEquals(11, beanHolder.getBean().getIntVal());
+    }
+
+    public void testOK02() {
+        String yaml = "--- !!org.yaml.snakeyaml.issues.issue9.BeanHolder\nbean : !!org.yaml.snakeyaml.issues.issue9.Bean2\n  intVal : 22\n  strVal : HALLO_2 ";
+        Iterator<Object> docs = new Yaml().loadAll(yaml).iterator();
+        assertTrue(docs.hasNext());
+        BeanHolder beanHolder = (BeanHolder) docs.next();
+        assertEquals("HALLO_2", beanHolder.getBean().getStrVal());
+        assertEquals(22, beanHolder.getBean().getIntVal());
+    }
+
+    public void testOK03() {
+        String yaml = "--- !!org.yaml.snakeyaml.issues.issue9.BeanHolder\nbean : !!org.yaml.snakeyaml.issues.issue9.Bean1\n  intVal : 1";
+        Iterator<Object> docs = new Yaml().loadAll(yaml).iterator();
+        assertTrue(docs.hasNext());
+        BeanHolder beanHolder = (BeanHolder) docs.next();
+        assertEquals("BEAN_1", beanHolder.getBean().getStrVal());
+        assertEquals(1, beanHolder.getBean().getIntVal());
+    }
+
+    public void testOK04() {
+        String yaml = "--- !!org.yaml.snakeyaml.issues.issue9.BeanHolder\nbean : !!org.yaml.snakeyaml.issues.issue9.Bean2\n  intVal : 22";
+        Iterator<Object> docs = new Yaml().loadAll(yaml).iterator();
+        assertTrue(docs.hasNext());
+        BeanHolder beanHolder = (BeanHolder) docs.next();
+        assertEquals("BEAN_2", beanHolder.getBean().getStrVal());
+        assertEquals(22, beanHolder.getBean().getIntVal());
+    }
+
+    public void testOK05() {
+        String yaml = "--- !!org.yaml.snakeyaml.issues.issue9.BeanHolder\nbean : !!org.yaml.snakeyaml.issues.issue9.Bean1\n  strVal : HALLO_1 ";
+        Iterator<Object> docs = new Yaml().loadAll(yaml).iterator();
+        assertTrue(docs.hasNext());
+        BeanHolder beanHolder = (BeanHolder) docs.next();
+        assertEquals("HALLO_1", beanHolder.getBean().getStrVal());
+        assertEquals(1, beanHolder.getBean().getIntVal());
+    }
+
+    public void testOK06() {
+        String yaml = "--- !!org.yaml.snakeyaml.issues.issue9.BeanHolder\nbean : !!org.yaml.snakeyaml.issues.issue9.Bean2\n  strVal : HALLO_2 ";
+        Iterator<Object> docs = new Yaml().loadAll(yaml).iterator();
+        assertTrue(docs.hasNext());
+        BeanHolder beanHolder = (BeanHolder) docs.next();
+        assertEquals("HALLO_2", beanHolder.getBean().getStrVal());
+        assertEquals(2, beanHolder.getBean().getIntVal());
+    }
+
+    public void testEmptyBean() {
+        String yaml = "--- !!org.yaml.snakeyaml.issues.issue9.BeanHolder\nbean : !!org.yaml.snakeyaml.issues.issue9.Bean1";
+        Loader loader = new Loader(new BeanConstructor());
+        Iterator<Object> docs = new Yaml(loader).loadAll(yaml).iterator();
+        assertTrue(docs.hasNext());
+        BeanHolder beanHolder = (BeanHolder) docs.next();
+        assertEquals("BEAN_1", beanHolder.getBean().getStrVal());
+        assertEquals(1, beanHolder.getBean().getIntVal());
+    }
+
+    public void testEmptyBean2() {
+        String yaml = "--- !!org.yaml.snakeyaml.issues.issue9.BeanHolder\nbean : !!org.yaml.snakeyaml.issues.issue9.Bean1 {}";
+        Iterator<Object> docs = new Yaml().loadAll(yaml).iterator();
+        assertTrue(docs.hasNext());
+        BeanHolder beanHolder = (BeanHolder) docs.next();
+        assertEquals("BEAN_1", beanHolder.getBean().getStrVal());
+        assertEquals(1, beanHolder.getBean().getIntVal());
+    }
+
+    public void testEmptyDoc() {
+        String yaml = "--- !!org.yaml.snakeyaml.issues.issue9.BeanHolder";
+        Loader loader = new Loader(new BeanConstructor());
+        Iterator<Object> docs = new Yaml(loader).loadAll(yaml).iterator();
+        assertTrue(docs.hasNext());
+        BeanHolder beanHolder = (BeanHolder) docs.next();
+        assertEquals("BEAN_1", beanHolder.getBean().getStrVal());
+        assertEquals(1, beanHolder.getBean().getIntVal());
+    }
+
+    public void qtestNonBean() {
+        String yaml = "--- !!org.yaml.snakeyaml.issues.issue9.BeanHolder\nbean : !!org.yaml.snakeyaml.issues.issue9.Bean1 123";
+        Iterator<Object> docs = new Yaml().loadAll(yaml).iterator();
+        assertTrue(docs.hasNext());
+        BeanHolder beanHolder = (BeanHolder) docs.next();
+        assertEquals("BEAN_1", beanHolder.getBean().getStrVal());
+        assertEquals(1, beanHolder.getBean().getIntVal());
+    }
+}
