diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..6aa68cd7
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,6 @@
+# Treat all Go files in this repo as binary, with no git magic updating
+# line endings. Windows users contributing to Go will need to use a
+# modern version of git and editors capable of LF line endings.
+
+*.go -text diff=golang
+
diff --git a/.golangci.yml b/.golangci.yml
new file mode 100644
index 00000000..a0df40ba
--- /dev/null
+++ b/.golangci.yml
@@ -0,0 +1,10 @@
+linters:
+  enable-all: true
+  disable:
+    - lll
+    - gochecknoinits
+    - gochecknoglobals
+    - funlen
+    - whitespace
+    - wsl
+    - godox
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 00000000..4d85a1bf
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,20 @@
+language: go
+
+os:
+  - linux
+  - windows
+
+branches:
+  only:
+    - master
+    - develop
+    - /^feature\/travis\/.+$/ # feature/travis/*
+    - /^fix\/travis\/.+$/ # fix/travis/*
+
+install:
+  - go get -d -u github.com/golang/dep
+  - go install github.com/golang/dep/cmd/dep
+  - dep ensure
+  - ./test install
+
+script: ./test --scripted
diff --git a/test b/test
new file mode 100755
index 00000000..003aa41e
--- /dev/null
+++ b/test
@@ -0,0 +1,195 @@
+#!/bin/bash
+
+warnings=0
+errors=0
+scripted=0
+goUp="\\e[1A"
+all=0
+fullTestFlags="-short"
+install=0
+
+function help {
+  echo "usage: $0 [command] [options]"
+  echo ""
+  echo "commands:"
+  echo "  <none>        run baseline tests"
+  echo "  all           run all tests"
+  echo "  install       install deps for running baseline tests"
+  echo "  install all   install deps for running all tests"
+  echo ""
+  echo "options:"
+  echo "  --scripted    dont jump console lines (still use colors)"
+  echo "  [package]     run tests only on this package"
+}
+
+function run {
+  if [[ $scripted -eq 0 ]]; then
+    echo "[......] $*"
+  fi
+
+  # create tmpfile
+  tmpfile=$(mktemp)
+  # execute
+  $* >$tmpfile 2>&1
+  rc=$?
+  output=$(cat $tmpfile)
+
+  # check return code
+  if [[ $rc -eq 0 ]]; then
+    if [[ $output == *"[no test files]"* ]]; then
+      echo -e "${goUp}[\e[01;33mNOTEST\e[00m] $*"
+      warnings=$((warnings+1))
+    else
+      echo -ne "${goUp}[\e[01;32m  OK  \e[00m] "
+      if [[ $2 == "test" ]]; then
+        echo -n $*
+        echo -n ": "
+        echo $output | cut -f "3-" -d " "
+      else
+        echo $*
+      fi
+    fi
+  else
+    if [[ $output == *"build constraints exclude all Go files"* ]]; then
+      echo -e "${goUp}[ !=OS ] $*"
+    else
+      echo -e "${goUp}[\e[01;31m FAIL \e[00m] $*"
+      cat $tmpfile
+      errors=$((errors+1))
+    fi
+  fi
+
+  rm -f $tmpfile
+}
+
+function checkformat {
+  if [[ $scripted -eq 0 ]]; then
+    echo "[......] gofmt $1"
+  fi
+
+  output=$(gofmt -l $GOPATH/src/$1/*.go)
+  if [[ $output == "" ]]; then
+    echo -e "${goUp}[\e[01;32m  OK  \e[00m] gofmt $*"
+  else
+    echo -e "${goUp}[\e[01;31m FAIL \e[00m] gofmt $*"
+    echo "The following files do not conform to gofmt:"
+    gofmt -l $GOPATH/src/$1/*.go # keeps format
+    errors=$((errors+1))
+  fi
+}
+
+# get and switch to script dir
+baseDir="$( cd "$(dirname "$0")" && pwd )"
+cd "$baseDir"
+
+# args
+while true; do
+  case "$1" in
+  "-h"|"help"|"--help")
+    help
+    exit 0
+    ;;
+  "--scripted")
+    scripted=1
+    goUp=""
+    shift 1
+    ;;
+  "install")
+    install=1
+    shift 1
+    ;;
+  "all")
+    all=1
+    fullTestFlags=""
+    shift 1
+    ;;
+  *)
+    break
+    ;;
+  esac
+done
+
+# check if $GOPATH/bin is in $PATH
+if [[ $PATH != *"$GOPATH/bin"* ]]; then
+  export PATH=$GOPATH/bin:$PATH
+fi
+
+# install
+if [[ $install -eq 1 ]]; then
+  echo "installing dependencies..."
+  echo "$ go get -u golang.org/x/lint/golint"
+  go get -u golang.org/x/lint/golint
+  if [[ $all -eq 1 ]]; then
+    echo "$ go get -u github.com/golangci/golangci-lint/cmd/golangci-lint"
+    go get -u github.com/golangci/golangci-lint/cmd/golangci-lint
+  fi
+  exit 0
+fi
+
+# check dependencies
+if [[ $(which go) == "" ]]; then
+  echo "go command not found"
+  exit 1
+fi
+if [[ $(which gofmt) == "" ]]; then
+  echo "gofmt command not found"
+  exit 1
+fi
+if [[ $(which golint) == "" ]]; then
+  echo "golint command not found"
+  echo "install with: go get -u golang.org/x/lint/golint"
+  echo "or run: ./test install"
+  exit 1
+fi
+if [[ $all -eq 1 ]]; then
+  if [[ $(which golangci-lint) == "" ]]; then
+    echo "golangci-lint command not found"
+    echo "install locally with: go get -u github.com/golangci/golangci-lint/cmd/golangci-lint"
+    echo "or run: ./test install all"
+    echo ""
+    echo "hint: install for CI with: curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin vX.Y.Z"
+    echo "don't forget to specify the version you want"
+    exit 1
+  fi
+fi
+
+# target selection
+if [[ "$1" == "" ]]; then
+  # get all packages
+  packages=$(go list ./...)
+else
+  # single package testing
+  packages=$(go list)/$1
+  if [[ ! -d "$GOPATH/src/$packages" ]]; then
+    echo "go package $packages does not exist"
+    help
+    exit 1
+  fi
+  echo "note: only running tests for package $packages"
+fi
+
+# platform info
+platformInfo=$(go env GOOS GOARCH)
+echo "running tests for ${platformInfo//$'\n'/ }:"
+
+# run vet/test on packages
+for package in $packages; do
+  echo ""
+  echo $package
+  checkformat $package
+  run golint -set_exit_status -min_confidence 1.0 $package
+  run go vet $package
+  if [[ $all -eq 1 ]]; then
+    run golangci-lint run $GOPATH/src/$package
+  fi
+  run go test -cover $fullTestFlags $package
+done
+
+echo ""
+if [[ $errors -gt 0 ]]; then
+  echo "failed with $errors errors and $warnings warnings"
+  exit 1
+else
+  echo "succeeded with $warnings warnings"
+  exit 0
+fi