diff --git a/meshmode/mesh/refinement.py b/meshmode/mesh/refinement.py
index abac4003231edfd124bf49dce90435be06ad7c67..58f76ca3cc96ccb35b5d21440edb1aaa62192465 100644
--- a/meshmode/mesh/refinement.py
+++ b/meshmode/mesh/refinement.py
@@ -505,24 +505,23 @@ class Refiner(object):
                                             self.vertex_to_ray[mx_idx][cur_pmap.ray])
 
                                         #stupid bug: don't use i when already in use
+                                        print "ELEMENTS: ", elements
                                         for el in elements:
                                             if el != (iel_base + iel_grp):
                                                 verts_elements[len(verts_elements)-1].append(el)
                                                 new_hanging_vertex_element[vertices_idx].append(el)
-                                                print "HANGING: ", el
                                         self.vertex_to_ray[vertices_idx][cur_pmap.ray] = \
                                             self.vertex_to_ray[mx_idx][cur_pmap.ray].prev
-                                        print "NODE: ", self.vertex_to_ray[vertices_idx][cur_pmap.ray]        
+                                        print iel_base+iel_grp, "NODE: ", self.vertex_to_ray[vertices_idx][cur_pmap.ray]        
                                     else:
                                         elements = self.vertex_to_ray[mx_idx][cur_pmap.ray].value.elements
                                         self.rays[cur_pmap.ray].insert(Adj(vertices_idx, copy.deepcopy(elements)),
                                             self.vertex_to_ray[mn_idx][cur_pmap.ray])
-
+                                        print "ELEMENTS:", elements
                                         for el in elements:
                                             if el != (iel_base + iel_grp):
                                                 verts_elements[len(verts_elements)-1].append(el)
                                                 new_hanging_vertex_element[vertices_idx].append(el)
-                                                print "HANGING: ", el
 
                                         self.vertex_to_ray[vertices_idx][cur_pmap.ray] = \
                                             self.vertex_to_ray[mn_idx][cur_pmap.ray].prev
@@ -537,6 +536,21 @@ class Refiner(object):
                                     vertices_idx += 1
                                 else:
                                     cur_midpoint = self.pair_map[vertex_pair].midpoint
+                                    elements = self.vertex_to_ray[cur_midpoint][cur_pmap.ray].prev.value.elements
+                                    print "ALREADY ELEMENTS:", elements
+                                    for el in elements:
+                                        if el != (iel_base + iel_grp) and el not in verts_elements[len(verts_elements)-1]:
+                                            verts_elements[len(verts_elements)-1].append(el)
+                                    elements = self.vertex_to_ray[cur_midpoint][cur_pmap.ray].value.elements
+                                    print "ALREADY ELEMENTS:", elements
+                                    for el in elements:
+                                        if el != (iel_base + iel_grp) and el not in verts_elements[len(verts_elements)-1]:
+                                            verts_elements[len(verts_elements)-1].append(el)
+
+                                    for el in new_hanging_vertex_element[cur_midpoint]:
+                                        if el != (iel_base + iel_grp) and el not in verts_elements[len(verts_elements)-1]:
+                                            verts_elements[len(verts_elements)-1].append(el)
+                                    print "HEREEEEE:", cur_midpoint, verts_elements[len(verts_elements)-1]
                                     verts.append(cur_midpoint)
                                     #new_hanging_vertex_element[cur_midpoint] = []
                                 #print new_hanging_vertex_element
@@ -568,6 +582,7 @@ class Refiner(object):
                                 if jtuple_ind in k and\
                                     midpointtuple_ind in k:
                                         element_indices_2.append(k_ind)
+                            print "INDICES:", element_indices_1, element_indices_2
                             midpoint_ind += 1
                             #print "ELEMENTIDX1: ", element_indices_1
                             #print "ELEMENTIDX2: ", element_indices_2
@@ -602,12 +617,16 @@ class Refiner(object):
                                 node_els = start_node.value.elements
                                 #print "OLD NODE ELS: ", node_els
                                 #print node_els
+                                print "ORIG: ", node_els
                                 node_els.remove(iel_base+iel_grp)
+                                print "AFTER: ", node_els
                                 for k in first_element_index:
                                     if k == 0:
                                         node_els.append(iel_base+iel_grp)
                                     else:
                                         node_els.append(iel_base+nelements_in_grp+k - 1)
+                                print "RESULT: ", node_els
+                                print "NODE RESULT:", start_node.value.elements
                                 #print "NEW_NODE_ELS: ", node_els
                                 #node_els[iold_el] = iel_base+nelements_in_grp+first_element_index
                                 #print "HANGING: ", new_hanging_vertex_element[start_node.value.vertex]
@@ -620,14 +639,14 @@ class Refiner(object):
                                         new_hanging_vertex_element[start_node.value.vertex][to_replace_index] =\
                                                 iel_base+nelements_in_grp+first_element_index
                                         '''
-                                        #print "OLD HANGING VERTEX ELEMENT: ", new_hanging_vertex_element
+                                        print "OLD HANGING VERTEX ELEMENT: ", new_hanging_vertex_element[start_node.value.vertex]
                                         new_hanging_vertex_element[start_node.value.vertex].remove(iel_base+iel_grp)
                                         for k in first_element_index:
                                             if k == 0:
                                                 new_hanging_vertex_element[start_node.value.vertex].append(iel_base+iel_grp)
                                             else:
                                                 new_hanging_vertex_element[start_node.value.vertex].append(iel_base+nelements_in_grp+k - 1)
-                                        #print "NEW HANGING VERTEX ELEMENT: ", new_hanging_vertex_element
+                                        print "NEW HANGING VERTEX ELEMENT: ", new_hanging_vertex_element[start_node.value.vertex]
                                 start_node = start_node.next
                             # hop along ray from midpoint node to end node
                             while start_node != end_node:
@@ -636,12 +655,15 @@ class Refiner(object):
                                 node_els = start_node.value.elements
                                 #iold_el = node_els.index(iel_base+iel_grp)
                                 #node_els[iold_el] = iel_base+nelements_in_grp+second_element_index
+                                print "ORIG:", node_els
                                 node_els.remove(iel_base+iel_grp)
                                 for k in second_element_index:
                                     if k == 0:
                                         node_els.append(iel_base+iel_grp)
                                     else:
                                         node_els.append(iel_base+nelements_in_grp+k-1)
+                                print "RESULT:", node_els
+                                print "HANGING EL:", new_hanging_vertex_element[start_node.value.vertex]
                                 if new_hanging_vertex_element[start_node.value.vertex] and \
                                     new_hanging_vertex_element[start_node.value.vertex].count(
                                         iel_base+iel_grp):
@@ -651,18 +673,77 @@ class Refiner(object):
                                         new_hanging_vertex_element[start_node.value.vertex][to_replace_index] =\
                                                 iel_base+nelements_in_grp+second_element_index
                                         '''
-                                        #print "OLD HANGING VERTEX ELEMENT: ", new_hanging_vertex_element
+                                        print "OLD HANGING VERTEX ELEMENT: ", new_hanging_vertex_element[start_node.value.vertex]
                                         new_hanging_vertex_element[start_node.value.vertex].remove(iel_base+iel_grp)
                                         for k in second_element_index:
                                             if k == 0:
                                                 new_hanging_vertex_element[start_node.value.vertex].append(iel_base+iel_grp)
                                             else:
                                                 new_hanging_vertex_element[start_node.value.vertex].append(iel_base+nelements_in_grp+k-1)
-                                        #print "NEW HANGING VERTEX ELEMENT: ", new_hanging_vertex_element
+                                        print "NEW HANGING VERTEX ELEMENT: ", new_hanging_vertex_element[start_node.value.vertex]
                                 start_node = start_node.next
 
+                        unique_vertex_pairs = [
+                                (i,j) for i in range(len(verts)) for j in range(i+1, len(verts))]
+                        midpoint_ind = 0
+                        for i, j in unique_vertex_pairs:
+                            mn_idx = min(verts[i], verts[j]) 
+                            mx_idx = max(verts[i], verts[j])
+                            vertex_pair = (mn_idx, mx_idx)
+                            if not vertex_pair in self.pair_map:
+                                continue
+                            element_indices = []
+                            for k_ind, k in enumerate(self.tri_result):
+                                ituple_ind = self.tri_node_tuples.index(self.index_to_midpoint_tuple[i])
+                                jtuple_ind = self.tri_node_tuples.index(self.index_to_midpoint_tuple[j])
+                                if ituple_ind in k and\
+                                    jtuple_ind in k:
+                                        element_indices.append(k_ind)
+                            print "MID_INDICES:", element_indices
+                            #print "ELEMENTIDX1: ", element_indices_1
+                            #print "ELEMENTIDX2: ", element_indices_2
+                            cur_pmap = self.pair_map[vertex_pair]
+                            start_node =\
+                            self.vertex_to_ray[mn_idx][cur_pmap.ray]
+                            end_node = self.vertex_to_ray[mx_idx][cur_pmap.ray]
+                            while start_node != end_node:
+                                # replace old (big) element with new
+                                # (refined) element
+                                node_els = start_node.value.elements
+                                #print "OLD NODE ELS: ", node_els
+                                #print node_els
+                                print "ORIG: ", node_els
+                                node_els.remove(iel_base+iel_grp)
+                                for k in element_indices:
+                                    if k == 0:
+                                        node_els.append(iel_base+iel_grp)
+                                    else:
+                                        node_els.append(iel_base+nelements_in_grp+k - 1)
+                                print "RESULT: ", node_els
+                                print "NODEELSHERE:", start_node.value
+                                #print "NEW_NODE_ELS: ", node_els
+                                #node_els[iold_el] = iel_base+nelements_in_grp+first_element_index
+                                #print "HANGING: ", new_hanging_vertex_element[start_node.value.vertex]
+                                if new_hanging_vertex_element[start_node.value.vertex] and \
+                                    new_hanging_vertex_element[start_node.value.vertex].count(
+                                        iel_base+iel_grp):
+                                        '''
+                                        to_replace_index = new_hanging_vertex_element[start_node.value.vertex].\
+                                                index(iel_base+iel_grp)
+                                        new_hanging_vertex_element[start_node.value.vertex][to_replace_index] =\
+                                                iel_base+nelements_in_grp+first_element_index
+                                        '''
+                                        print "OLD HANGING VERTEX ELEMENT: ", new_hanging_vertex_element[start_node.value.vertex]
+                                        new_hanging_vertex_element[start_node.value.vertex].remove(iel_base+iel_grp)
+                                        for k in element_indices:
+                                            if k == 0:
+                                                new_hanging_vertex_element[start_node.value.vertex].append(iel_base+iel_grp)
+                                            else:
+                                                new_hanging_vertex_element[start_node.value.vertex].append(iel_base+nelements_in_grp+k - 1)
+                                        print "NEW HANGING VERTEX ELEMENT: ", new_hanging_vertex_element[start_node.value.vertex]
+                                start_node = start_node.next
                         # }}}
-
+                        #TODO: Update existing hanging nodes and elements for rays that may have already been generated by different element
                         #generate new rays
                         from llist import dllist, dllistnode
                         ind = 0
@@ -671,6 +752,8 @@ class Refiner(object):
                                 mn_vert = min(verts[i], verts[j])
                                 mx_vert = max(verts[i], verts[j])
                                 vertex_pair = (mn_vert, mx_vert)
+                                if vertex_pair in self.pair_map:
+                                    continue
                                 els = []
                                 common_elements = list(set(verts_elements[i]).intersection(
                                     verts_elements[j]))
@@ -684,6 +767,7 @@ class Refiner(object):
                                             els.append(iel_base+iel_grp)
                                         else:
                                             els.append(iel_base + nelements_in_grp + kind - 1)
+                                print "THIS:", els
                                 #print "ELS: ", els
                                 #els.append(iel_base+iel_grp)
                                 #els.append(iel_base+nelements_in_grp+ind)
@@ -710,6 +794,7 @@ class Refiner(object):
                             node_tuple_to_coord[node_tuple] = grp.vertex_indices[iel_grp][node_ind]
                         for midpoint_ind, midpoint_tuple in enumerate(self.index_to_midpoint_tuple):
                             node_tuple_to_coord[midpoint_tuple] = verts[midpoint_ind]
+                        o_nelements_in_grp = nelements_in_grp
                         for i in six.moves.range(0, len(self.tri_result)):
                             for j in six.moves.range(0, len(self.tri_result[i])):
                                 if i == 0:
@@ -724,6 +809,59 @@ class Refiner(object):
                         print nelements
                         print "vertex_indices: ", groups[grpn][385]
                         print new_hanging_vertex_element[130]
+
+                        '''
+                        if iel_base + iel_grp == 2 or iel_base+iel_grp == 1:
+                            print "LJKASFLKJASFASKL:JFASFLA:SFJ"
+                            for i in six.moves.range(len(groups[grpn][385])):
+                                for j in six.moves.range(i+1, len(groups[grpn][385])):
+                                    mn = min(groups[grpn][385][i], groups[grpn][385][j])
+                                    mx = max(groups[grpn][385][j], groups[grpn][385][i])
+                                    d = self.pair_map[(mn, mx)].d
+                                    ray = self.pair_map[(mn, mx)].ray
+                                    if d:
+                                        print self.vertex_to_ray[mn][ray]
+                                        if 385 not in self.vertex_to_ray[mn][ray].value.elements:
+                                            self.vertex_to_ray[mn][ray].value.elements.append(385)
+                                            print "FIXED:", self.vertex_to_ray[mn][ray]
+                                    else:
+                                        print self.vertex_to_ray[mx][ray]
+                                        if 385 not in self.vertex_to_ray[mx][ray].value.elements:
+                                            self.vertex_to_ray[mx][ray].value.elements.append(385)
+                                            print "FIXED:", self.vertex_to_ray[mx][ray]
+                        '''
+                        '''
+                        print "REPAIRING:", iel_base+iel_grp
+                        for i in six.moves.range(len(groups[grpn][iel_base+iel_grp])):
+                            for j in six.moves.range(i+1, len(groups[grpn][iel_base+iel_grp])):
+                                mn = min(groups[grpn][iel_base+iel_grp][i], groups[grpn][iel_base+iel_grp][j])
+                                mx = max(groups[grpn][iel_base + iel_grp][i], groups[grpn][iel_base+iel_grp][j])
+                                d = self.pair_map[(mn, mx)].d
+                                ray = self.pair_map[(mn, mx)].ray
+                                if d:
+                                    if iel_base+iel_grp not in self.vertex_to_ray[mn][ray].value.elements:
+                                        self.vertex_to_ray[mn][ray].value.elements.append(iel_base+iel_grp)
+                                else:
+                                    if iel_base + iel_grp not in self.vertex_to_ray[mx][ray].value.elements:
+                                        self.vertex_to_ray[mx][ray].value.elements.append(iel_base+iel_grp)
+                        for elem in six.moves.range(nelements_in_grp):
+                            #print "REPAIRING:", elem
+                            for i in six.moves.range(len(groups[grpn][elem])):
+                                for j in six.moves.range(i+1, len(groups[grpn][elem])):
+                                    mn = min(groups[grpn][elem][i], groups[grpn][elem][j])
+                                    mx = max(groups[grpn][elem][i], groups[grpn][elem][j])
+                                    d = self.pair_map[(mn, mx)].d
+                                    ray = self.pair_map[(mn, mx)].ray
+                                    if d:
+                                        if elem not in self.vertex_to_ray[mn][ray].value.elements:
+                                            print "FAILING!!!!!"
+                                            self.vertex_to_ray[mn][ray].value.elements.append(elem)
+                                    else:
+                                        if elem not in self.vertex_to_ray[mx][ray].value.elements:
+                                            print "FAILING!!!!!"
+                                            self.vertex_to_ray[mx][ray].value.elements.append(elem)
+                        '''
+
                         #print nelements_in_grp
                         #print self.tri_node_tuples
                         #print self.tri_result