First attempt to group instead of searching
diff --git a/lib/Krawfish/Result/Group/Characters.pm b/lib/Krawfish/Result/Group/Characters.pm
new file mode 100644
index 0000000..9dc5d83
--- /dev/null
+++ b/lib/Krawfish/Result/Group/Characters.pm
@@ -0,0 +1,57 @@
+package Krawfish::Result::Group::Character;
+use Krawfish::Log;
+use strict;
+use warnings;
+
+use constant DEBUG => 0;
+
+sub new {
+  my $class = shift;
+  bless {
+    segments   => shift, # Krawfish::Index::Segments object
+    from_start => shift,  # boolean - otherwise from end
+    char_count => shift
+    nrs => [@_]
+  }, $class;
+};
+
+
+sub get_group {
+  my ($self, $match) = @_;
+
+  # Get all classes from the match
+  my @classes = $self->get_classes($self->{nrs});
+
+  my $segments = $self->{segments};
+
+  my %group;
+
+  # Classes have nr, start, end
+  foreach my $class (sort { $a->start <=> $b->start } @classes) {
+
+    if ($self->{from_start}) {
+
+      # This will retrieve the segment from the segments stream
+      my $segment = $stream->get($match->doc_id, $class->start);
+
+      if ($segment->)
+
+        # The character count can be satisfied by the
+      my $first_chars = $segment->first_chars;
+
+      if (length($first_chars) <= $self->{char_count} {
+        substr($first_chars);
+      }
+      
+      # Check, if the segment only spans one segment
+      if ($class->end != $class->start+1) {
+        
+      };
+    }
+    else {
+      ...
+    };
+  };
+};
+
+1;
diff --git a/lib/Krawfish/Result/Group/Classes.pm b/lib/Krawfish/Result/Group/Classes.pm
new file mode 100644
index 0000000..a974758
--- /dev/null
+++ b/lib/Krawfish/Result/Group/Classes.pm
@@ -0,0 +1,69 @@
+package Krawfish::Result::Group::Classes;
+use Krawfish::Log;
+use strict;
+use warnings;
+
+# TODO:
+#   The name is somehow misleading, as this will only
+#   group by surface terms.
+
+use constant DEBUG => 0;
+
+sub new {
+  my $class = shift;
+  bless {
+    segments   => shift, # Krawfish::Index::Segments object
+    nrs => [@_],
+    groups => {}
+  }, $class;
+};
+
+
+# This will return a string, reflecting the group name of the list
+sub get_group {
+  my ($self, $match) = @_;
+
+  # Get all classes from the match
+  # Classes need to be sorted by start position
+  # to be retrievable, in case the Segments-Stream
+  # is implemented as a postingslist (probably not)
+  my @classes = $self->get_classes_sorted($self->{nrs});
+
+  my %class_group;
+
+  # Classes have nr, start, end
+  foreach my $class (@classes) {
+
+    # WARNIG! CLASSES MAY OVERLAP SO SEGMENTS SHOULD BE CACHED OR BUFFERED!
+
+    # Get start position
+    my $start = $class->start;
+
+    my @seq = ();
+
+    # Receive segment
+    my $seg = $segments->get($match->doc_id, $start);
+
+    # Push term id to segment
+    push (@seq, $seg->term_id);
+
+    while ($start < $class->end -1) {
+      $seg = $segments->get($match->doc_id, $start++);
+
+      # Push term id to segment
+      push (@seq, $seg->term_id);
+    };
+
+    $class_group{$class->nr} = join('|', @seq);
+  };
+
+  my $string = '';
+  foreach (sort {$a <=> $b} keys %class_group) {
+    $string .= $_ .':' . class_group{$_} . ';';
+  };
+
+  return $string;
+};
+
+
+1;