diff --git a/.known-issues/README b/.known-issues/README
new file mode 100644
index 0000000..ddd8f5a
--- /dev/null
+++ b/.known-issues/README
@@ -0,0 +1,55 @@
+This directory contains configuration files to ignore errors found in
+the build and test process which are known to the developers and for
+now can be safely ignored.
+
+To use:
+
+ $ cd zephyr
+ $ make SOMETHING >& result
+ $ scripts/filter-known-issues.py result
+
+It is included in the source tree so if anyone has to submit anything
+that triggers some kind of error that is a false positive, it can
+include the "ignore me" file, properly documented.
+
+Each file can contain one or more multiline Python regular expressions
+(https://docs.python.org/2/library/re.html#regular-expression-syntax)
+that match an error message. Multiple regular expressions are
+separated by comment blocks (that start with #). Note that an empty
+line still is considered part of the multiline regular expression.
+
+For example
+
+---beginning---
+#
+# This testcase always fails, pending fix ZEP-1234
+#
+.*/tests/kernel/grumpy .* FAIL
+#
+# Documentation issue, masks:
+#
+# /home/e/inaky/z/kernel.git/doc/api/io_interfaces.rst:28: WARNING: Invalid definition: Expected identifier in nested name. [error at 19]
+#  struct dev_config::@65  dev_config::bits
+#  -------------------^
+#
+^(?P<filename>.+/doc/api/io_interfaces.rst):(?P<lineno>[0-9]+): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
+^\s+struct dev_config::@[0-9]+  dev_config::bits.*
+^\s+-+\^
+---end---
+
+Note you want to:
+
+- use relateive paths; instead of
+  /home/me/mydir/zephyr/something/somewhere.c you will want
+  ^.*/something/somewhere.c (as they will depend on where it is being
+  built)
+
+- Replace line numbers with [0-9]+, as they will change
+
+- (?P<filename>[-._/\w]+/something/somewhere.c) saves the match on
+  that file path in a "variable" called 'filename' that later you can
+  match with (?P=filename) if you want to match multiple lines of the
+  same error message.
+
+Can get really twisted and interesting in terms of regexps; they are
+powerful, so start small :)
diff --git a/.known-issues/doc/bluetooth.conf b/.known-issues/doc/bluetooth.conf
new file mode 100644
index 0000000..d5e57d9
--- /dev/null
+++ b/.known-issues/doc/bluetooth.conf
@@ -0,0 +1,26 @@
+#
+# Bluetooth unnamed struct definition
+#
+# FIXME: all these should match the relative filename
+#
+^(?P<filename>[-._/\w]+/doc/api/bluetooth.rst):(?P<lineno>[0-9]+): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]$
+^[ \t]*$
+^[ \t]*\^$
+^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]$
+^[ \t]*$
+^[ \t]*\^$
+^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected end of definition. \[error at [0-9]+]$
+^.*bt_conn_info.__unnamed__.*$
+^[- \t]*\^$
+#
+# Bluetooth GATT unnamed struct definition
+#
+^(?P<filename>[-._/\w]+/doc/api/bluetooth.rst):(?P<lineno>[0-9]+): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
+^[ \t]*
+^[ \t]*\^
+^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
+^[ \t]*
+^[ \t]*\^
+^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected end of definition. \[error at [0-9]+]
+^.*bt_gatt_read_params.__unnamed__.*
+^[- \t]*\^
diff --git a/.known-issues/doc/header_footer.conf b/.known-issues/doc/header_footer.conf
new file mode 100644
index 0000000..a432d1c
--- /dev/null
+++ b/.known-issues/doc/header_footer.conf
@@ -0,0 +1,23 @@
+#
+# Prints the PWD : FIXME, this is going to be removed
+#
+^pwd
+^.*/doc
+#
+# KERNELVERSION not being defined in local builds, kill that warning,
+# can ignore it
+#
+^.*/Kconfig.zephyr:[0-9]+: warning: The symbol KERNELVERSION references the non-existent environment variable KERNELVERSION.*
+#
+# Documentation generation, early message
+#
+^cd .* && doxygen doc/doxygen.config
+^srctree=.* SRCARCH=\w+ python scripts/genrest/genrest.py .*$
+# This cuts the sphinx build line; has to be separate because in the
+# middle, we have removed the KERNELVERSION one and a full regex won't match
+^sphinx-build -t \w+ -b html -d [-._/\w]+  -q \. .*
+#
+# Documentation generation, footer message
+#
+^[ \t]*
+^Build finished. The HTML pages are in [-._/\w]+
diff --git a/.known-issues/doc/sensor.conf b/.known-issues/doc/sensor.conf
new file mode 100644
index 0000000..1ce4359
--- /dev/null
+++ b/.known-issues/doc/sensor.conf
@@ -0,0 +1,12 @@
+#
+# Sensor value unnamed struct definition
+#
+^(?P<filename>[-._/\w]+/doc/api/io_interfaces.rst):(?P<lineno>[0-9]+): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
+^[ \t]*
+^[ \t]*\^
+^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
+^[ \t]*
+^[ \t]*\^
+^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected end of definition. \[error at [0-9]+]
+^.*sensor_value.__unnamed__.*
+^[- \t]*\^
diff --git a/.known-issues/doc/uart.conf b/.known-issues/doc/uart.conf
new file mode 100644
index 0000000..1a6373c
--- /dev/null
+++ b/.known-issues/doc/uart.conf
@@ -0,0 +1,15 @@
+#
+# UART unnamed struct definition
+#
+^(?P<filename>[-._/\w]+/doc/api/io_interfaces.rst):(?P<lineno>[0-9]+): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
+^[ \t]*
+^[ \t]*\^
+^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
+^[ \t]*
+^[ \t]*\^
+^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
+^[ \t]*
+^[ \t]*\^
+^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected end of definition. \[error at [0-9]+]
+^.*uart_device_config.__unnamed__.*
+^[- \t]*\^
diff --git a/.known-issues/make.conf b/.known-issues/make.conf
new file mode 100644
index 0000000..bbc14d7
--- /dev/null
+++ b/.known-issues/make.conf
@@ -0,0 +1,4 @@
+#
+# Make blurbs
+#
+^make: (Entering|Leaving) directory .*
diff --git a/MAINTAINERS b/MAINTAINERS
index 59ec42e..e5268f7 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -204,6 +204,13 @@
 F:	arch/x86/
 F:	include/arch/x86/
 
+KNOWN ISSUES
+M:	Anas Nashif <anas.nashif@intel.com>
+M:	Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
+M:	Javier B Perez <javier.b.perez.hernandez@intel.com>
+F:	.known-issues/
+
+
 THE REST
 M:	Anas Nashif <anas.nashif@intel.com>
 L:	devel@lists.zephyrproject.com
diff --git a/scripts/filter-known-issues.py b/scripts/filter-known-issues.py
new file mode 100755
index 0000000..1aa7772
--- /dev/null
+++ b/scripts/filter-known-issues.py
@@ -0,0 +1,151 @@
+#! /usr/bin/python
+import argparse
+import logging
+import mmap
+import os
+import re
+import sys
+
+exclude_regexs = []
+
+noncomment_regex = re.compile(
+        "(^[ \t][^#]+.*\n)+"
+        , re.MULTILINE)
+
+def config_import_file(filename):
+    """
+    Imports regular expresions from any file *.conf in the given path
+
+    Each file follows the format::
+
+      #
+      # Comments for multiline regex 1...
+      #
+      multilineregex
+      multilineregex
+      multilineregex
+      #
+      # Comments for multiline regex 2...
+      #
+      multilineregex
+      multilineregex
+      multilineregex
+
+    etc.
+    """
+    try:
+        with open(filename, "rb") as f:
+            mm = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ)
+            # That regex basically selects any block of
+            # lines that is not a comment block. The
+            # finditer() finds all the blocks and selects
+            # the bits of mmapped-file that comprises
+            # each--we compile it into a regex and append.
+            for m in re.finditer("(^\s*[^#].*\n)+", mm, re.MULTILINE):
+                origin = "%s:%s-%s" % (filename, m.start(), m.end())
+                try:
+                    r = re.compile(mm[m.start():m.end()], re.MULTILINE)
+                except Exception as e:
+                    logging.error("%s: bytes %d-%d: bad regex: %s",
+                                  filename, m.start(), m.end(), e)
+                    raise
+                logging.debug("%s: found regex at bytes %d-%d: %s",
+                              filename, m.start(), m.end(),
+                              mm[m.start():m.end()])
+                exclude_regexs.append((r, origin))
+            logging.debug("%s: loaded", filename)
+    except Exception as e:
+        raise Exception("E: %s: can't load config file: %s" % (filename, e))
+
+def config_import_path(path):
+    """
+    Imports regular expresions from any file *.conf in the given path
+    """
+    file_regex = re.compile(".*\.conf$")
+    try:
+        for dirpath, dirnames, filenames in os.walk(path):
+            for _filename in sorted(filenames):
+                filename = os.path.join(dirpath, _filename)
+                if not file_regex.search(_filename):
+                    logging.debug("%s: ignored", filename)
+                    continue
+                config_import_file(filename)
+    except Exception as e:
+        raise Exception("E: %s: can't load config files: %s" % (path, e))
+
+def config_import(paths):
+    """
+    Imports regular expresions from any file *.conf in the list of paths.
+
+    If a path is "" or None, the list of paths until then is flushed
+    and only the new ones are considered.
+    """
+    _paths = []
+    # Go over the list, flush it if the user gave an empty path ("")
+    for path in paths:
+        if path == "" or path == None:
+            logging.debug("flushing current config list: %s", _paths)
+            _paths = []
+        else:
+            _paths.append(path)
+    logging.debug("config list: %s", _paths)
+    for path in _paths:
+        config_import_path(path)
+
+arg_parser = argparse.ArgumentParser()
+arg_parser.add_argument("-v", "--verbosity", action = "count", default = 0,
+                        help = "increase verbosity")
+arg_parser.add_argument("-q", "--quiet", action = "count", default = 0,
+                        help = "decrease verbosity")
+arg_parser.add_argument("-c", "--config-dir", action = "append", nargs = "?",
+                        default = [ ".known-issues/" ],
+                        help = "configuration directory (multiple can be "
+                        "given; if none given, clears the current list) "
+                        "%(default)s")
+arg_parser.add_argument("FILENAMEs", nargs = "+",
+                        help = "files to filter")
+args = arg_parser.parse_args()
+
+logging.basicConfig(level = 40 - 10 * (args.verbosity - args.quiet),
+                    format = "%(levelname)s: %(message)s")
+
+path = ".known-issues/"
+logging.debug("Reading configuration from directory `%s`", path)
+config_import(args.config_dir)
+
+exclude_ranges = []
+
+for filename in args.FILENAMEs:
+    try:
+        with open(filename, "r+b") as f:
+            logging.info("%s: filtering", filename)
+            # Yeah, this should be more protected in case of exception
+            # and such, but this is a short running program...
+            mm = mmap.mmap(f.fileno(), 0)
+            for ex, origin in exclude_regexs:
+                logging.info("%s: searching from %s: %s",
+                             filename, origin, ex.pattern)
+                for m in re.finditer(ex.pattern, mm, re.MULTILINE):
+                    logging.debug("%s: %s-%s: match from from %s",
+                                  filename, m.start(), m.end(), origin)
+                    exclude_ranges.append((m.start(), m.end()))
+
+            exclude_ranges = sorted(exclude_ranges, key=lambda r: r[0])
+            logging.warning("%s: ranges excluded: %s", filename, exclude_ranges)
+
+            # Printd what has not been filtered
+            offset = 0
+            for b, e in exclude_ranges:
+                mm.seek(offset)
+                d = b - offset
+                logging.debug("%s: exclude range (%d, %d), from %d %dB",
+                              filename, b, e, offset, d)
+                if b > offset:
+                    print(mm.read(d - 1))
+                offset = e
+            mm.seek(offset)
+            if len(mm) != offset:
+                print mm.read(len(mm) - offset - 1)
+            del mm
+    except Exception as e:
+        logging.error("%s: cannot load: %s", filename, e)
