diff --git a/src/main/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandler.java b/src/main/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandler.java
index 4f6145b2b07f5fad1e05c8a341d82af931b23900..f82bd1761bddd981fd1d2a03de40275d1783751b 100644
--- a/src/main/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandler.java
+++ b/src/main/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandler.java
@@ -123,8 +123,9 @@ public class TypedAdjacencyMethodHandler implements MethodHandler<TypedAdjacency
         ReflectionUtility.determineTypeValue(type);
         ReflectionUtility.determineTypeField(type);
 
-        final Vertex newVertex = framedGraph.addVertex(null);
-        final Object newNode = framedGraph.frame(newVertex, type);
+        final Object newNode = framedGraph.addVertex(null, type);
+        assert newNode instanceof VertexFrame;
+        final Vertex newVertex = ((VertexFrame)newNode).asVertex();
         assert type.isInstance(newNode);
 
         switch(direction) {
diff --git a/src/test/java/com/syncleus/grail/graph/SimpleSignalNode.java b/src/test/java/com/syncleus/grail/graph/SimpleSignalNode.java
new file mode 100644
index 0000000000000000000000000000000000000000..d079d435306d3fd68cbc017175de38840b8af5dd
--- /dev/null
+++ b/src/test/java/com/syncleus/grail/graph/SimpleSignalNode.java
@@ -0,0 +1,64 @@
+/******************************************************************************
+ *                                                                             *
+ *  Copyright: (c) Syncleus, Inc.                                              *
+ *                                                                             *
+ *  You may redistribute and modify this source code under the terms and       *
+ *  conditions of the Open Source Community License - Type C version 1.0       *
+ *  or any later version as published by Syncleus, Inc. at www.syncleus.com.   *
+ *  There should be a copy of the license included with this file. If a copy   *
+ *  of the license is not included you are granted no right to distribute or   *
+ *  otherwise use this file except through a legal and valid license. You      *
+ *  should also contact Syncleus, Inc. at the information below if you cannot  *
+ *  find a license:                                                            *
+ *                                                                             *
+ *  Syncleus, Inc.                                                             *
+ *  2604 South 12th Street                                                     *
+ *  Philadelphia, PA 19148                                                     *
+ *                                                                             *
+ ******************************************************************************/
+package com.syncleus.grail.graph;
+
+import com.tinkerpop.blueprints.Direction;
+import com.tinkerpop.frames.modules.typedgraph.TypeValue;
+
+@TypeValue("SimpleSignalNode")
+public interface SimpleSignalNode extends SignalNode {
+    @TypedAdjacency(label="parent", direction= Direction.IN)
+    <N extends SimpleSignalNode> Iterable<? extends N> getChildren(Class<? extends N> type);
+
+    @TypedAdjacency(label="parent", direction= Direction.OUT)
+    <N extends SimpleSignalNode> Iterable<? extends N> getParents(Class<? extends N> type);
+
+    @TypedAdjacency(label="parent", direction= Direction.BOTH)
+    <N extends SimpleSignalNode> Iterable<? extends N> getFamily(Class<? extends N> type);
+
+    @TypedAdjacency(label="parent", direction= Direction.BOTH)
+    <N extends SimpleSignalNode> N addInbreed(Class<? extends N> type);
+
+    @TypedAdjacency(label="parent", direction= Direction.IN)
+    <N extends SimpleSignalNode> N getChild(Class<? extends N> type);
+
+    @TypedAdjacency(label="parent", direction= Direction.OUT)
+    <N extends SimpleSignalNode> N getParent(Class<? extends N> type);
+
+    @TypedAdjacency(label="parent", direction= Direction.BOTH)
+    <N extends SimpleSignalNode> N getFamilyMember(Class<? extends N> type);
+
+    @TypedIncidence(label="parent", direction= Direction.IN)
+    <E extends SignalMultiplyingEdge> Iterable<? extends E> getChildEdges(Class<? extends E> type);
+
+    @TypedIncidence(label="parent", direction= Direction.OUT)
+    <E extends SignalMultiplyingEdge> Iterable<? extends E> getParentEdges(Class<? extends E> type);
+
+    @TypedIncidence(label="parent", direction= Direction.BOTH)
+    <E extends SignalMultiplyingEdge> Iterable<? extends E> getFamilyEdges(Class<? extends E> type);
+
+    @TypedIncidence(label="parent", direction= Direction.IN)
+    <E extends SignalMultiplyingEdge> E getChildEdge(Class<? extends E> type);
+
+    @TypedIncidence(label="parent", direction= Direction.OUT)
+    <E extends SignalMultiplyingEdge> E getParentEdge(Class<? extends E> type);
+
+    @TypedIncidence(label="parent", direction= Direction.BOTH)
+    <E extends SignalMultiplyingEdge> E getFamilyMemberEdge(Class<? extends E> type);
+}
diff --git a/src/test/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandlerTest.java b/src/test/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandlerTest.java
index 68513b690524b4e92765544b114498718cd6672b..aa10010cc102c02a1a148d9179cb8c7d4c3b33a8 100644
--- a/src/test/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandlerTest.java
+++ b/src/test/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandlerTest.java
@@ -18,10 +18,17 @@
  ******************************************************************************/
 package com.syncleus.grail.graph;
 
-import com.tinkerpop.blueprints.Element;
+import com.syncleus.grail.graph.action.*;
+import com.tinkerpop.blueprints.*;
 import com.tinkerpop.frames.*;
+import com.tinkerpop.frames.modules.Module;
+import junit.framework.*;
+import org.junit.*;
+import org.junit.Assert;
 import org.junit.Test;
+
 import java.lang.reflect.Method;
+import java.util.*;
 
 public class TypedAdjacencyMethodHandlerTest {
     private static final TypedAdjacencyMethodHandler HANDLER = new TypedAdjacencyMethodHandler(null);
@@ -30,6 +37,9 @@ public class TypedAdjacencyMethodHandlerTest {
     private static final Object MOCK_FRAME = new Object();
     private static final Element MOCK_ELEMENT = new MockElement();
     private static final Element MOCK_VERTEX = new MockVertex();
+    private static final FramedGraphFactory FACTORY = new GrailGraphFactory(Collections.<Module>emptyList(),
+            new HashSet<Class<?>>(Arrays.asList(new Class<?>[]{
+                    SimpleSignalNode.class})));
 
     static {
         try {
@@ -69,4 +79,61 @@ public class TypedAdjacencyMethodHandlerTest {
 
         HANDLER.processElement(MOCK_FRAME, GET_SON_METHOD, null, TYPED_ANNOTATION, framedGraph, MOCK_VERTEX);
     }
+
+    @Test
+    public void testGetBothNodes() {
+        final FramedTransactionalGraph<?> graph = FACTORY.create(new MockTransactionalTinkerGraph());
+
+        // construct graph
+        final SimpleSignalNode father = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class);
+        final SimpleSignalNode child = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class);
+        final SimpleSignalNode grandchild = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class);
+        final SignalMultiplyingEdge fatherEdge = (SignalMultiplyingEdge) graph.addEdge(null, child.asVertex(), father.asVertex(), "parent", SignalMultiplyingEdge.class);
+        final SignalMultiplyingEdge childEdge = (SignalMultiplyingEdge) graph.addEdge(null, grandchild.asVertex(), child.asVertex(), "parent", SignalMultiplyingEdge.class);
+
+        Assert.assertEquals(getIteratorSize(child.getParents(SimpleSignalNode.class).iterator()), 1);
+        Assert.assertEquals(getIteratorSize(child.getFamily(SimpleSignalNode.class).iterator()), 2);
+    }
+
+    @Test
+    public void testGetBothNode() {
+        final FramedTransactionalGraph<?> graph = FACTORY.create(new MockTransactionalTinkerGraph());
+
+        // construct graph
+        final SimpleSignalNode father = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class);
+        final SimpleSignalNode child = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class);
+        final SimpleSignalNode grandchild = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class);
+        final SignalMultiplyingEdge fatherEdge = (SignalMultiplyingEdge) graph.addEdge(null, child.asVertex(), father.asVertex(), "parent", SignalMultiplyingEdge.class);
+        final SignalMultiplyingEdge childEdge = (SignalMultiplyingEdge) graph.addEdge(null, grandchild.asVertex(), child.asVertex(), "parent", SignalMultiplyingEdge.class);
+
+        Assert.assertNotNull(child.getParent(SimpleSignalNode.class));
+        Assert.assertTrue(child.getParent(SimpleSignalNode.class) instanceof SimpleSignalNode);
+        Assert.assertNotNull(child.getFamilyMember(SimpleSignalNode.class));
+        Assert.assertTrue(child.getFamilyMember(SimpleSignalNode.class) instanceof SimpleSignalNode);
+    }
+
+    @Test
+    public void testAddBothNode() {
+        final FramedTransactionalGraph<?> graph = FACTORY.create(new MockTransactionalTinkerGraph());
+
+        // construct graph
+        SimpleSignalNode child = (SimpleSignalNode) graph.addVertex(Integer.valueOf(1), SimpleSignalNode.class);
+        final SimpleSignalNode inbreedChild = child.addInbreed(SimpleSignalNode.class);
+
+        Assert.assertEquals(2, getIteratorSize(inbreedChild.getFamily(SimpleSignalNode.class).iterator()));
+        Assert.assertEquals(1, getIteratorSize(inbreedChild.getParents(SimpleSignalNode.class).iterator()));
+        Assert.assertEquals(1, getIteratorSize(inbreedChild.getChildren(SimpleSignalNode.class).iterator()));
+        Assert.assertEquals(2, getIteratorSize(graph.getVertices().iterator()));
+        Assert.assertEquals(2, getIteratorSize(child.getFamily(SimpleSignalNode.class).iterator()));
+        Assert.assertEquals(1, getIteratorSize(child.getParents(SimpleSignalNode.class).iterator()));
+    }
+
+    private static int getIteratorSize(Iterator<?> iterator) {
+        int count = 0;
+        while(iterator.hasNext()) {
+            iterator.next();
+            count++;
+        }
+        return count;
+    }
 }
diff --git a/src/test/java/com/syncleus/grail/graph/TypedIncidenceMethodHandlerTest.java b/src/test/java/com/syncleus/grail/graph/TypedIncidenceMethodHandlerTest.java
index a77ea1b8b6c9635e5cc8019d774823621d4e7603..9d94e683b2e1c93f0eddb00d395bb723e86bfbd7 100644
--- a/src/test/java/com/syncleus/grail/graph/TypedIncidenceMethodHandlerTest.java
+++ b/src/test/java/com/syncleus/grail/graph/TypedIncidenceMethodHandlerTest.java
@@ -19,10 +19,12 @@
 package com.syncleus.grail.graph;
 
 import com.tinkerpop.blueprints.Element;
-import com.tinkerpop.frames.FramedGraph;
-import org.junit.Test;
+import com.tinkerpop.frames.*;
+import com.tinkerpop.frames.modules.Module;
+import org.junit.*;
 
 import java.lang.reflect.Method;
+import java.util.*;
 
 public class TypedIncidenceMethodHandlerTest {
     private static final TypedIncidenceMethodHandler HANDLER = new TypedIncidenceMethodHandler(null);
@@ -32,6 +34,9 @@ public class TypedIncidenceMethodHandlerTest {
     private static final Object MOCK_FRAME = new Object();
     private static final Element MOCK_ELEMENT = new MockElement();
     private static final Element MOCK_VERTEX = new MockVertex();
+    private static final FramedGraphFactory FACTORY = new GrailGraphFactory(Collections.<Module>emptyList(),
+            new HashSet<Class<?>>(Arrays.asList(new Class<?>[]{
+                    SimpleSignalNode.class})));
 
     static {
         try {
@@ -85,4 +90,45 @@ public class TypedIncidenceMethodHandlerTest {
 
         HANDLER.processElement(MOCK_FRAME, GET_SON_EDGE_METHOD, null, TYPED_ANNOTATION, framedGraph, MOCK_VERTEX);
     }
+
+    @Test
+    public void testGetBothEdges() {
+        final FramedTransactionalGraph<?> graph = FACTORY.create(new MockTransactionalTinkerGraph());
+
+        // construct graph
+        final SimpleSignalNode father = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class);
+        final SimpleSignalNode child = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class);
+        final SimpleSignalNode grandchild = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class);
+        final SignalMultiplyingEdge fatherEdge = (SignalMultiplyingEdge) graph.addEdge(null, child.asVertex(), father.asVertex(), "parent", SignalMultiplyingEdge.class);
+        final SignalMultiplyingEdge childEdge = (SignalMultiplyingEdge) graph.addEdge(null, grandchild.asVertex(), child.asVertex(), "parent", SignalMultiplyingEdge.class);
+
+        Assert.assertEquals(getIteratorSize(child.getParentEdges(SignalMultiplyingEdge.class).iterator()), 1);
+        Assert.assertEquals(getIteratorSize(child.getFamilyEdges(SignalMultiplyingEdge.class).iterator()), 2);
+    }
+
+    @Test
+    public void testGetBothEdge() {
+        final FramedTransactionalGraph<?> graph = FACTORY.create(new MockTransactionalTinkerGraph());
+
+        // construct graph
+        final SimpleSignalNode father = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class);
+        final SimpleSignalNode child = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class);
+        final SimpleSignalNode grandchild = (SimpleSignalNode) graph.addVertex(null, SimpleSignalNode.class);
+        final SignalMultiplyingEdge fatherEdge = (SignalMultiplyingEdge) graph.addEdge(null, child.asVertex(), father.asVertex(), "parent", SignalMultiplyingEdge.class);
+        final SignalMultiplyingEdge childEdge = (SignalMultiplyingEdge) graph.addEdge(null, grandchild.asVertex(), child.asVertex(), "parent", SignalMultiplyingEdge.class);
+
+        Assert.assertNotNull(child.getParentEdge(SignalMultiplyingEdge.class));
+        Assert.assertTrue(child.getParentEdge(SignalMultiplyingEdge.class) instanceof SignalMultiplyingEdge);
+        Assert.assertNotNull(child.getFamilyMemberEdge(SignalMultiplyingEdge.class));
+        Assert.assertTrue(child.getFamilyMemberEdge(SignalMultiplyingEdge.class) instanceof SignalMultiplyingEdge);
+    }
+
+    private static int getIteratorSize(Iterator<?> iterator) {
+        int count = 0;
+        while(iterator.hasNext()) {
+            iterator.next();
+            count++;
+        }
+        return count;
+    }
 }