Query section entries based on start/end date and type
Update

Found the solution for my first question.

For current events my working solution is:

{% set entries = craft.entries()
  .section('messages')
  .type('event')
  .startDate('&lt;= ' ~ now|date('c'))
  .endDate('&gt;= ' ~ now|date('c'))
  .orderBy('startDate asc')
  .all()
%}

{% for entry in entries %}
  &lt;h1&gt;{{ entry.title }}&lt;/h1&gt;
{% endfor %}


For upcoming events a simpler solution is:

{% set entries = craft.entries()
  .section('messages')
  .type('event')
  .startDate('&gt; ' ~ now|date('c'))
  .orderBy('startDate asc')
  .all()
%}

{% for entry in entries %}
    &lt;h1&gt;{{ entry.title }}&lt;/h1&gt;
{% endfor %}


I can't figure out how to get my second question working. 

I need to query all messages (type: news and events) and exclude current and upcoming events. The output: all messages of type news and all messages of type events that happened in the past. Including pagination.

It should be a combination of this i think:

{% set news = craft.entries()
  .section('messages')
  .type('news')
  .all()
%}

{% set events = craft.entries()
  .section('messages')
  .type('event')
  .startDate('&lt; ' ~ now|date('c'))
  .endDate('&lt; ' ~ now|date('c'))
  .all()
%}


Together combined with ordering by post date and pagination. Help! :-)