diff --git a/lib/aethyr/core/connection/player_connect.rb b/lib/aethyr/core/connection/player_connect.rb
index 912af4a0c93775c6e806797fae64af3f51f096d6..025cadbb2c7992156970e2687f0df669b820db92 100644
--- a/lib/aethyr/core/connection/player_connect.rb
+++ b/lib/aethyr/core/connection/player_connect.rb
@@ -114,7 +114,7 @@ class PlayerConnection
 
   #Send message without newline
   def print(message, parse = true, newline = false, message_type: :main)
-    @display.print(message, parse, newline, message_type: message_type) unless closed?
+    @display.send(message, parse, add_newline: newline, message_type: message_type) unless closed?
   end
 
   #Close the io connection
diff --git a/lib/aethyr/core/render/display.rb b/lib/aethyr/core/render/display.rb
index 12163c7edb2529ba7e7e2f213977e19d2130b534..49823bd72bf7ea60a5028ca5154344267ce534b5 100644
--- a/lib/aethyr/core/render/display.rb
+++ b/lib/aethyr/core/render/display.rb
@@ -40,7 +40,7 @@ class Display
     Ncurses.stdscr.intrflush(false) # turn off flush-on-interrupt
     Ncurses.stdscr.keypad(true)     # turn on keypad mode
 
-    Ncurses.scrollok(Ncurses.stdscr, true)
+    #Ncurses.scrollok(Ncurses.stdscr, true)
     Ncurses.stdscr.clear
 
     layout
@@ -74,7 +74,11 @@ class Display
     when :basic
       Ncurses.delwin(@window_main_border) unless @window_main_border.nil?
       @window_main_border = Ncurses::WINDOW.new(@height - 3, 0, 0, 0)
+      @window_main_border_height = @window_main_border.getmaxy - 2
+      @window_main_border_width = @window_main_border.getmaxx - 2
       @window_main = @window_main_border.derwin(@window_main_border.getmaxy - 2, @window_main_border.getmaxx - 2, 1, 1)
+      @window_main_height = @window_main.getmaxy - 2
+      @window_main_width = @window_main.getmaxx - 2
       Ncurses.scrollok(@window_main, true)
       @window_main.clear
       @window_main.move(@window_main.getmaxy - 2,1)
@@ -110,13 +114,17 @@ class Display
 
       Ncurses.delwin(@window_main_border) unless @window_main_border.nil?
       @window_main_border = Ncurses::WINDOW.new(36, 0, @height - 39, 82)
+      @window_main_border_height = @window_main_border.getmaxy - 2
+      @window_main_border_width = @window_main_border.getmaxx - 2
       @window_main = @window_main_border.derwin(@window_main_border.getmaxy - 2, @window_main_border.getmaxx - 2, 1, 1)
+      @window_main_height = @window_main.getmaxy - 2
+      @window_main_width = @window_main.getmaxx - 2
       Ncurses.scrollok(@window_main, true)
       @window_main.clear
       @window_main.move(@window_main.getmaxy - 2,1)
       @buffer[:main] = [] if @buffer[:main].nil?
       parse_buffer
-      buffer_from = [@buffer_lines[:main].length * -1, -1 * (@height - 3 + @buffer_pos + 1)].max
+      buffer_from = [@buffer_lines[:main].length * -1, -1 * (33 + @buffer_pos + 1)].max
       buffer_to = [@buffer_lines[:main].length * -1, (@buffer_pos + 1) * -1].max
       log "rendering #{buffer_from} #{buffer_to}"
       @buffer_lines[:main][buffer_from..buffer_to].each do | message|
@@ -188,37 +196,6 @@ class Display
     buffer.each do |message|
       new_message = message.gsub(/\t/, '     ')
       new_message.tr!("\r", '')
-      # split displays some weird behavior and thus need to be fixed.
-      # one or more newlines at the end of the message will just be dropped
-      # (no empty strings affrf). Moreover any time more than one newline would
-      # occur in a row would be treated as a single new line.
-
-      #to solve this perform the split, take the first element, this is your
-      # first line, if it is empty then its just an empty line.
-      # now remove the first element of the split and whatever content it has
-      # also remove that content from the begining of the string that you just
-      # split.
-      # The next character in the string will either be end of string or a
-      # newline. If its a newline drop it as this was accounted for.
-      # for each additional newline that is next add another blank line to the
-      # lines. Once the next character is not a new line repeat the loop as above.
-      #
-      # split_message = new_message.split("\n")
-      # if (split_message.nil? or split_message.length == 0) && (new_message.nil? == false && new_message.start_with? "\n")
-      #   for new_message.length.times do
-      #     buffer_lines << ""
-      #   end
-      # else
-      #   for split_message.each do |line|
-      #     buffer_lines << line
-      #     new_message.drop(0, line.length)
-      #     new_message.slice!(0, 1) if new_message.start_with? "\n"
-      #     while new_message.start_with? "\n" do
-      #       new_message.slice!(0, 1)
-      #       buffer_lines << ""
-      #     end
-      #   end
-      # end
 
       last_was_text = false
       new_message.split(/(\n)/) do |line|
@@ -237,7 +214,7 @@ class Display
     end
   end
 
-  def word_wrap(line, cols = 80)
+  def word_wrap(line, cols = @window_main_width)
     lines = []
     new_line = ""
     new_length = 0;
@@ -251,7 +228,7 @@ class Display
         new_length += 1
       end
 
-      if new_length > 80
+      if new_length > cols
         lines << new_line
         new_line = ""
         new_length = 0
@@ -263,27 +240,12 @@ class Display
     return lines
   end
 
-  #Send message without newline
-  def print(message, parse = true, newline = false, message_type: :main)
-    if parse
-      message.gsub!(/\t/, '     ')
-      message = paginate(message)
-    end
-    if newline and message[-1..-1] != "\n"
-      if message[-2..-2] == "\r"
-        message << "\n"
-      else
-        message << "\r\n"
-      end
-    end
-    send( message, message_type: message_type, add_newline: newline)
-  end
-
-  def send (message, message_type: :main, internal_clear: false, add_newline: true)
+  def send (message, word_wrap = true, message_type: :main, internal_clear: false, add_newline: true)
     window = nil
 
     unless @buffer[message_type].nil?
       @buffer[message_type] << message.dup
+      @buffer[message_type] << "" if add_newline
       @buffer[message_type].drop(@buffer[message_type].length - BUFFER_SIZE) if @buffer[message_type].length > BUFFER_SIZE
     end
 
@@ -310,20 +272,22 @@ class Display
     window.clear if internal_clear and not message_type.eql? :main
 
     if message_type == :main && @buffer[:main].nil? == false
-      render_buffer(@window_main)
+      render_buffer(channel: :main)
     else
       render(message, window, add_newline: add_newline)
     end
   end
 
-  def render_buffer(window = @window_main)
+  def render_buffer(channel: :main)
+    raise "only handle main channel for now" if channel != :main
     parse_buffer
-    window.clear
-    buffer_from = [@buffer_lines[:main].length * -1, -1 * (@height - 3 + @buffer_pos + 1)].max
+    #window.clear
+    buffer_from = [@buffer_lines[:main].length * -1, -1 * (@window_main_height + @buffer_pos + 1)].max
     buffer_to = [@buffer_lines[:main].length * -1, (@buffer_pos + 1) * -1].max
-    log "rendering #{@buffer_pos} #{buffer_from} #{buffer_to}"
+    log "rendering pos #{@buffer_pos} #{buffer_from} to #{buffer_to} height #{@height}"
+    @window_main.move(0,0)
     @buffer_lines[:main][buffer_from..buffer_to].each do | message|
-      render(message, window)
+      colored_send(@window_main, message + "\n")
     end
   end
 
@@ -670,7 +634,7 @@ CONF
           case ch
           when 126 #page up
             @buffer_pos += 1 if @buffer_pos < BUFFER_SIZE && @buffer_pos < @buffer_lines[:main].length - 33
-            render_buffer(@window_main)
+            render_buffer(channel: :main)
             escape = nil
             next
           else
@@ -682,7 +646,7 @@ CONF
           case ch
           when 126 #page down
             @buffer_pos -= 1 if @buffer_pos > 0
-            render_buffer(@window_main)
+            render_buffer(channel: :main)
             escape = nil
             next
           else