diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedDistanceSpans.java
index e08db92..06227e2 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedDistanceSpans.java
@@ -126,25 +126,23 @@
             if (currentFirstSpan.getStart() < currentSecondSpan.getStart()
                     || isLastCandidateSmaller(currentFirstSpan,
                             currentSecondSpan)) {
-                // log.trace("current target: "
-                // + firstSpanList.get(0).getStart() + " "
-                // + firstSpanList.get(0).getEnd());
-                // System.out.println("candidates:");
-                // for (CandidateSpan cs: secondSpanList) {
-                // System.out.println(cs.getStart() +" "+ cs.getEnd());
-                // }
+//                log.trace("current target: " + firstSpanList.get(0).getStart()
+//                        + " " + firstSpanList.get(0).getEnd());
+//                System.out.println("candidates:");
+//                for (CandidateSpan cs : secondSpanList) {
+//                    System.out.println(cs.getStart() + " " + cs.getEnd());
+//                }
 
                 matchList = findMatches(currentFirstSpan, secondSpanList, true);
                 updateList(firstSpanList);
             }
             else {
-                // log.trace("current target: "
-                // + secondSpanList.get(0).getStart() + " "
-                // + secondSpanList.get(0).getEnd());
-                // System.out.println("candidates:");
-                // for (CandidateSpan cs: firstSpanList) {
-                // System.out.println(cs.getStart() +" "+ cs.getEnd());
-                // }
+//                log.trace("current target: " + secondSpanList.get(0).getStart()
+//                        + " " + secondSpanList.get(0).getEnd());
+//                System.out.println("candidates:");
+//                for (CandidateSpan cs : firstSpanList) {
+//                    System.out.println(cs.getStart() + " " + cs.getEnd());
+//                }
 
                 matchList = findMatches(currentSecondSpan, firstSpanList,
                         false);
@@ -264,7 +262,7 @@
      * @return a candidate span match
      */
     protected CandidateSpan createMatchCandidate (CandidateSpan target,
-            CandidateSpan cs, boolean isDistanceZero) {
+            CandidateSpan cs, boolean isDistanceZero, boolean isTargetFirstSpan) {
 
         int start = Math.min(target.getStart(), cs.getStart());
         int end = Math.max(target.getEnd(), cs.getEnd());
@@ -282,6 +280,14 @@
         }
         CandidateSpan match = new CandidateSpan(start, end, doc, cost,
                 payloads);
+        if (isTargetFirstSpan) {
+            match.setChildSpan(target);
+            match.setSecondChildSpan(cs);
+        }
+        else {
+            match.setChildSpan(cs);
+            match.setSecondChildSpan(target);
+        }
         //match.setChildSpan(cs);
         return match;
     }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedElementDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedElementDistanceSpans.java
index 0e4b7fa..388e97b 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedElementDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedElementDistanceSpans.java
@@ -261,38 +261,6 @@
         return matches;
     }
 
-
-    /**
-     * Creates a match from the two given spans (target and candidate)
-     * 
-     * @param target
-     *            the target span
-     * @param cs
-     *            the candidate span
-     * @param isDistanceZero
-     *            true if the distance between the two spans are zero,
-     *            false otherwise
-     * @param isTargetFirstSpan
-     *            true is the target span is of the first span, false
-     *            otherwise
-     * @return a match
-     */
-    private CandidateSpan createMatchCandidate (CandidateSpan target,
-            CandidateSpan cs, boolean isDistanceZero,
-            boolean isTargetFirstSpan) {
-        CandidateSpan match = createMatchCandidate(target, cs, isDistanceZero);
-        if (isTargetFirstSpan) {
-            match.setChildSpan(target);
-            match.setSecondChildSpan(cs);
-        }
-        else {
-            match.setChildSpan(cs);
-            match.setSecondChildSpan(target);
-        }
-        return match;
-    }
-
-
     @Override
     protected void updateList (List<CandidateSpan> candidateList) {
         updateElementList(candidateList.get(0).getPosition());
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedTokenDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedTokenDistanceSpans.java
index c0ac7f1..691f978 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedTokenDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedTokenDistanceSpans.java
@@ -127,12 +127,14 @@
 
         List<CandidateSpan> matches = new ArrayList<>();
         int actualDistance;
+        CandidateSpan match;
         for (CandidateSpan cs : candidateList) {
             if (minDistance == 0 &&
             // intersection
                     target.getStart() < cs.getEnd()
                     && cs.getStart() < target.getEnd()) {
-                matches.add(createMatchCandidate(target, cs, true));
+                match = createMatchCandidate(target, cs, true, isTargetFirstSpan);
+                matches.add(match);
                 continue;
             }
 
@@ -146,7 +148,8 @@
             }
             if (minDistance <= actualDistance
                     && actualDistance <= maxDistance) {
-                matches.add(createMatchCandidate(target, cs, false));
+                match = createMatchCandidate(target, cs, false, isTargetFirstSpan);
+                matches.add(match);
             }
         }
         return matches;
