Added Apache license headers, reworked versioning, and Dockerfile
diff --git a/AUTHORS.rst b/AUTHORS.rst
index 360f092..424072d 100644
--- a/AUTHORS.rst
+++ b/AUTHORS.rst
@@ -1,3 +1,18 @@
+<!--Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
 .. _authors:
 
 UserAle.pyqt5 is written and maintained by Draper and various contributors:
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 1fe6500..a3ff1bb 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -1,40 +1,63 @@
+<!--Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
 .. _changelog:
 
 Changelog
 =========
 
-1.0.4 (2016-08-04)
+0.1.5 (2016-09-09) 
 ------------------
-* New events UserAle is tracking:
+* clientTime field is represented in ISO 8601 format.
+* Sampling ``mouseenter``, ``mouseleave``, and ``dragmove`` events by ``resolution`` parameter.
+* Added Apache license headers.
+* Updated versioning numbers.
+* Added docker support.
 
-	* ``mousemove``
+0.1.4 (2016-08-04)
+------------------
+* New events Apache UserAle is tracking:
+
+	* ``move``
 	* ``resize``
 	* ``scroll``
 
 * Remove timer from ``dragdrop`` log due to incorrect time being recorded.
 * Session id is autogenerated if not passed into configuration.
 
-1.0.3 (2016-08-02)
+0.1.3 (2016-08-02)
 ------------------
-* New events UserAle is tracking:
+* New events Apache UserAle is tracking:
 
 	* ``mouseenter``
 	* ``mouseleave``
 
-1.0.2 (2016-08-01)
+0.1.2 (2016-08-01)
 ------------------
 * The elapsed time for a drag event is being recorded in the ``dragdrop`` log.
 
-1.0.1 (2016-07-29)
+0.1.1 (2016-07-29)
 ------------------
 
 * All logs will be stored to file called userale.log (configurable).
-* Users can specify which events to capture by passing in a list of event keys when instantiating UserAle.
-* These are the events UserAle is tracking:
+* Users can specify which events to capture by passing in a list of event keys when instantiating Apache UserAle.
+* These are the events Apache UserAle is tracking:
 
 	* ``mouseup``
 	* ``mousedown``
-	* ``mouseover``
+	* ``mousemove``
 	* ``keypress`` (optional)
 	* ``keydown`` (optional)
 	* ``dragenter``
@@ -42,7 +65,7 @@
 	* ``dragmove``
 	* ``dragdrop``
 
-1.0.0 (2016-06-24)
+0.1.0 (2016-06-24)
 ------------------
 
 Initial release.
\ No newline at end of file
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index 705f977..00ad167 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -1,3 +1,18 @@
+<!--Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
 .. _contributing:
 
 Contributing to UserAle.pyqt5
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..96fa80a
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,33 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Ubuntu Xenial 16.04 [LTS]
+FROM ubuntu:16.04
+
+# Install Deps
+RUN apt-get update -yqq && \
+    apt-get install -yqq python3-dev python3-pip qt5-default && \
+    apt-get clean && \
+    rm -rf /var/lib/apt/lists/*
+    
+COPY requirements.txt /opt/userale
+
+WORKDIR /opt
+
+# Install requirements
+RUN pip3 install -r requirements.txt
+
+#CMD ["python", "./setup.py", "develop"]
+
diff --git a/LICENSE b/LICENSE
index 8b33aad..af2bbe3 100644
--- a/LICENSE
+++ b/LICENSE
@@ -199,3 +199,61 @@
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
+
+================================================================================
+
+Apache UserALE.PyQt5 Subcomponents:
+
+The Apache UserALE.pyqt5 project contains subcomponents with separate copyright
+notices and license terms. Your use of the source code for the these
+subcomponents is subject to the terms and conditions of the following
+licenses.
+
+For 
+  userale/examples/testclose.py
+  userale/examples/testdragndrop.py
+  userale/examples/testdragndrop2.py
+
+  ZetCode PyQt5 tutorial
+
+  Copyright (C) 2007 - 2016 Jan Bodnar    
+  All rights reserved.
+
+For
+  userale/examples/testwindowflags.py:
+
+  Copyright (C) 2013 Riverbank Computing Limited.
+  Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+  All rights reserved.
+ 
+  This file is part of the examples of PyQt.
+
+  You may use this file under the terms of the BSD license as follows:
+ 
+  "Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions are
+  met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in
+      the documentation and/or other materials provided with the
+      distribution.
+    * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+      the names of its contributors may be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+ 
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+
+================================================================================
\ No newline at end of file
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..60d0cac
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,5 @@
+Apache UserALE.pyqt5
+Copyright 2016 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
\ No newline at end of file
diff --git a/README.rst b/README.rst
index cd27bd0..f4b2ed5 100644
--- a/README.rst
+++ b/README.rst
@@ -1,3 +1,18 @@
+<!--Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
 UserAle
 =======
 
diff --git a/docs/Makefile b/docs/Makefile
index eff75bf..abf99bb 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 # Makefile for Sphinx documentation
 #
 
diff --git a/docs/make.bat b/docs/make.bat
index 36ad11e..9ac9469 100644
--- a/docs/make.bat
+++ b/docs/make.bat
@@ -1,3 +1,18 @@
+:: Licensed to the Apache Software Foundation (ASF) under one or more

+:: contributor license agreements.  See the NOTICE file distributed with

+:: this work for additional information regarding copyright ownership.

+:: The ASF licenses this file to You under the Apache License, Version 2.0

+:: (the "License"); you may not use this file except in compliance with

+:: the License.  You may obtain a copy of the License at

+::

+::   http://www.apache.org/licenses/LICENSE-2.0

+::

+:: Unless required by applicable law or agreed to in writing, software

+:: distributed under the License is distributed on an "AS IS" BASIS,

+:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+:: See the License for the specific language governing permissions and

+:: limitations under the License.

+

 @ECHO OFF

 

 REM Command file for Sphinx documentation

diff --git a/docs/source/authors.rst b/docs/source/authors.rst
index 2c70d61..a919b4e 100644
--- a/docs/source/authors.rst
+++ b/docs/source/authors.rst
@@ -1,3 +1,18 @@
+<!--Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
 Authors
 -------
 
diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst
index 09929fe..77e020b 100644
--- a/docs/source/changelog.rst
+++ b/docs/source/changelog.rst
@@ -1 +1,16 @@
+<!--Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
 .. include:: ../../CHANGELOG.rst
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 5b2b3bf..b9e85d2 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License. 
+
 # UserAle documentation build configuration file, created by
 # sphinx-quickstart on Fri Jun 24 16:58:43 2016.
 #
diff --git a/docs/source/contents.rst.inc b/docs/source/contents.rst.inc
index cae63f1..57355ab 100644
--- a/docs/source/contents.rst.inc
+++ b/docs/source/contents.rst.inc
@@ -1,3 +1,18 @@
+<!--Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
 User's Guide
 ------------
 
diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst
index 8cb3146..43e2269 100644
--- a/docs/source/contributing.rst
+++ b/docs/source/contributing.rst
@@ -1 +1,16 @@
+<!--Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
 .. include:: ../../CONTRIBUTING.rst
\ No newline at end of file
diff --git a/docs/source/index.rst b/docs/source/index.rst
index e6cf542..8ab9893 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -1,3 +1,18 @@
+<!--Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
 .. include:: ../../README.rst
 
 .. include:: contents.rst.inc
diff --git a/docs/source/installation.rst b/docs/source/installation.rst
index 4717cd0..ce02451 100644
--- a/docs/source/installation.rst
+++ b/docs/source/installation.rst
@@ -1,3 +1,18 @@
+<!--Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
 .. _installation:
 
 Installation Guide
diff --git a/docs/source/license.rst b/docs/source/license.rst
index d31cf73..d197d89 100644
--- a/docs/source/license.rst
+++ b/docs/source/license.rst
@@ -1,13 +1,29 @@
+<!--Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
 License
 =======
 
-Copyright 2016 The Charles Stark Draper Laboratory, Inc.
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
 
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
+  http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst
index 1a8f8a2..31e9921 100644
--- a/docs/source/quickstart.rst
+++ b/docs/source/quickstart.rst
@@ -1,3 +1,18 @@
+<!--Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
 .. _quickstart:
 
 Quickstart Guide
diff --git a/docs/source/userale.rst b/docs/source/userale.rst
index ade0cab..ec83da4 100644
--- a/docs/source/userale.rst
+++ b/docs/source/userale.rst
@@ -1,3 +1,18 @@
+<!--Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
 .. _api:
 
 
diff --git a/requirements.txt b/requirements.txt
index c219351..969c527 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,12 +1,11 @@
-# -*- coding: utf-8 -*-
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
 #
-# Copyright 2016 The Charles Stark Draper Laboratory, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
+#   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
diff --git a/setup.cfg b/setup.cfg
index e639aa1..10bbb43 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 [egg_info]
 tag_svn_revision = false
 
diff --git a/setup.py b/setup.py
index bfdf020..ae7e75a 100644
--- a/setup.py
+++ b/setup.py
@@ -1,10 +1,11 @@
-# Copyright 2016 The Charles Stark Draper Laboratory, Inc.
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
 #
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
+#   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
@@ -79,7 +80,8 @@
             'mouse = userale.examples.testapp:test_app',
             'drag = userale.examples.testdragndrop:test_drag',
             'drag2 = userale.examples.testdragndrop2:test_drag2',
-            'window = userale.examples.testclose:test_close'
+            'window = userale.examples.testclose:test_close',
+            'controller = userale.examples.testwindowflags:test_controller'
         ]
     }
 )
diff --git a/userale/__init__.py b/userale/__init__.py
index 1c6a16b..bbcbee0 100644
--- a/userale/__init__.py
+++ b/userale/__init__.py
@@ -1,12 +1,11 @@
-# -*- coding: utf-8 -*-
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
 #
-# Copyright 2016 The Charles Stark Draper Laboratory, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
+#   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
diff --git a/userale/ale.py b/userale/ale.py
index ec7f9fb..fde937e 100644
--- a/userale/ale.py
+++ b/userale/ale.py
@@ -1,10 +1,11 @@
-# Copyright 2016 The Charles Stark Draper Laboratory, Inc.
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
 #
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
+#   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,36 +14,33 @@
 # limitations under the License.
 
 from userale.version import __version__
-from userale.format import StructuredMessage
-
+from userale.format import JsonFormatter
 from PyQt5.QtCore import QObject, QEvent
 import datetime
 import logging
 import uuid
 
-_ = StructuredMessage
+_ = JsonFormatter
 
 class Ale (QObject):
 
     def __init__(self, 
                  output="userale.log",
-                 interval=5000,
                  user=None,
                  session=None,
                  toolname=None,
                  toolversion=None,
                  keylog=False,
-                 resolution=500,
+                 resolution=100,   
                  shutoff=[]):
         """
         :param output: [str] The file or url path to which logs will be sent
-        :param interval: [int] The minimum time interval in ms betweeen batch transmission of logs
         :param user: [str] Identifier for the user of the application
         :param session: [str] Session tag to track same user with multiple sessions. If a session is not provided, one will be created
         :param toolname: [str] The application name
         :param toolversion: [str] The application version
         :param keylog: [bool] Should detailed key logs be recorded. Default is False
-        :param resolution: [int] Delay in ms between instances of high frequency logs like movemoves, scrolls, etc
+        :param resolution: [int] Delay in ms between instances of high frequency logs like mousemoves, scrolls, etc. Default is 100ms (10Hz).
         :param shutoff: [list] Turn off logging for specific events
     
         An example log will appear like this:
@@ -61,15 +59,13 @@
                 'session': '5ee42ccc-852c-44d9-a937-28d7901e4ead',
                 'toolName': 'myApplication',
                 'toolVersion': '3.5.0',
-                'useraleVersion': '1.0.0'
+                'useraleVersion': '0.1.0'
             }
         """
 
         QObject.__init__(self)
-
         # UserAle Configuration
         self.output = output
-        self.interval = interval
         self.user = user
         # Autogenerate session id if session is not configured
         self.session = session if session is not None else str (uuid.uuid4 ())
@@ -79,9 +75,6 @@
         self.resolution = resolution
         self.shutoff = shutoff
 
-        # Store logs
-        self.logs = []
-
         # Configure logging
         self.logger = logging
         self.logger.basicConfig(level=logging.INFO,
@@ -112,49 +105,76 @@
             if name in self.shutoff or (not self.keylog and (name == 'keypress' or name == 'keyrelease')):
                 del self.map [key]
 
+        # Sample rate 
+        self.hfreq = [QEvent.MouseMove, QEvent.DragMove, QEvent.Scroll]
+        self.logs = []
+        self.last = None
+        self.timer = None
+        self.flag = False
+
     def eventFilter (self, object, event):
         '''
         :param object: [QObject] The object being watched.
         :param event: [QEvent] The event triggered by a user action.
-        :return: [bool] Return true in order to filter the event out (stop it from being handled further). Otherwise return false.
+        :return: [bool] Propagate filter up if other objects needs to be handled
         
-        Filters events for the watched object (in this case, QApplication)
+        Filters events for the watched widget (in this case, QApplication)
         '''
 
+        if self.flag == False:
+            self.flag = True
+            self.timer = datetime.datetime.now ()
+
         data = None
         t = event.type ()
 
-        # if self.__valid (object) and t in self.map:
-        # if len (object.children ()) > 0 and t in self.map:
-        if t in self.map:
-            name = list (self.map [t].keys())[0]
-            method = list (self.map [t].values())[0]
-            data = method (name, event, object)
+        if t in self.map:        
+            # Handle leaf node 
+            if object.isWidgetType () and len(object.children ()) == 0:
+                name = list (self.map [t].keys())[0]
+                method = list (self.map [t].values())[0]
+                data = method (name, event, object)
+
+            # Handle window object
+            else:
+                # How to handle events on windows? It comes before the child widgets in window? 
+                # Either an event actually ocurred on window or is an effect of event propagation. 
+                pass
+
+        # Sample data
+        self.logs.append (data)
+
+        # Check time elapsed
+        elapsed = datetime.datetime.now () - self.timer
+        if elapsed.seconds == 1:
+            # print ("count = %d", len (self.logs)) 
+            self.flag = False
+            self.logs = []
 
         if data is not None:
             self.logger.info (_(data))
+
         return super(Ale, self).eventFilter (object, event)
 
-    def __valid (self, object):
-        # Parent is none?
-        #   capture it
-        # Parent exists - don't capture/capture Child/current object
-        
-        # Solo node
-        if object.parent () is None and len (object.children ()) == 0:
-            return True
+    def getSender (self, object):
+        '''
+        :param object: [QObject] The object being watched.
+        :return: [QObject] The QObject 
+        '''
 
-        # Leaf node
-        if object.parent () is not None and len (object.children ()) == 0:
-            return True
-        return False
+        sender = None
+        try:
+            sender = object.sender () if object.sender() is not None else None   
+        except:
+            pass
+        return sender
 
     def getSelector (self, object):
         """
         :param object: [QObject] The base class for all Qt objects.
         :return: [str] The Qt object's name
 
-        Get target object's name (object defined by user or object's meta class name)
+        Get target object's name (object defined by user or object's meta class name).
         """
         
         return object.objectName () if object.objectName () else object.staticMetaObject.className ()
@@ -175,10 +195,9 @@
     def getPath (self, object):
         """
         :param object: [QObject] The base class for all Qt objects.
-        :return: [list] List of QObjects up to the child object.
+        :return: [list] List of QObjects.
 
-        Fetch the entire path up the root of the tree for a leaf node object.
-        Recursive operation.
+        Generate the entire object hierachy from root to leaf node. 
         """
 
         if object.parent() is not None:
@@ -188,12 +207,12 @@
 
     def getClientTime (self):
         """
-        :return: [str] String representation of the time the event was triggered.
+        :return: [str] String representation of the time the event was captured.
         
-        Capture the time the event was captured. 
+        Capture the time the event was captured in milliseconds since the UNIX epoch (January 1, 1970 00:00:00 UTC)
         """
 
-        return str (datetime.datetime.now ())
+        return int (time.time() * 1000)
 
     def handleMouseEvents (self, event_type, event, object):
         """
@@ -204,8 +223,9 @@
 
         Returns the userale log representing all mouse event data. 
         """
-        
-        return self.__create_msg (event_type, event, object)
+
+        details = {}
+        return self.__create_msg (event_type, event, object, details=details)
 
     def handleKeyEvents (self, event_type, event, object):
         """
@@ -217,7 +237,7 @@
         Returns the userale log representing all key events, including key name and key code.
         """
 
-        details = {'key' : event.text (), 'keycode' : event.key ()}
+        details = {"key" : event.text (), "keycode" : event.key ()}
         return self.__create_msg (event_type, event, object, details=details)
 
     def handleDragEvents (self, event_type, event, object):
@@ -233,7 +253,7 @@
         details = {}
 
         try:
-            details ["source"] = self.getSelector (event.source())      
+            details ["source"] = self.getSelector (event.source ())      
         except:
             details ["source"] = None
 
@@ -248,6 +268,7 @@
 
         Returns the userale log representing all move events. 
         """
+
         details = {"oldPos" : {"x" : event.oldPos ().x (), "y" : event.oldPos ().y ()}}
         return self.__create_msg (event_type, event, object, details=details)
         
@@ -260,6 +281,7 @@
 
         Returns the userale log representing all resize events. 
         """
+
         details = {"size" : {"height" : event.size ().height (), "width" : event.size ().width ()},
                    "oldSize":  {"height" : event.oldSize ().height (), "width" : event.oldSize ().width ()}}
         return self.__create_msg (event_type, event, object, details=details)
@@ -273,6 +295,7 @@
 
         Returns the userale log representing all scroll events. 
         """
+
         return self.__create_msg (event_type, event, object)
 
     def __create_msg (self, event_type, event, object, details={}):
@@ -281,18 +304,18 @@
         """
 
         data = {
-            'target': self.getSelector (object) ,
-            'path': self.getPath (object),
-            'clientTime': self.getClientTime (),    
-            'location': self.getLocation (event),
-            'type': event_type ,
-            'userAction': 'true',
-            'details' : details,
-            'userId': self.user,
-            'session': self.session,
-            'toolName': self.toolname,
-            'toolVersion': self.toolversion,
-            'useraleVersion': __version__
+            "target": self.getSelector (object) ,
+            "path": self.getPath (object),
+            "clientTime": self.getClientTime (),    
+            "location": self.getLocation (event),
+            "type": event_type ,
+            "userAction": True,   # legacy field
+            "details" : details,
+            "userId": self.user,
+            "session": self.session,
+            "toolName": self.toolname,
+            "toolVersion": self.toolversion,
+            "useraleVersion": __version__
         }
 
         return data
diff --git a/userale/examples/__init__.py b/userale/examples/__init__.py
index e69de29..fa8ccd5 100644
--- a/userale/examples/__init__.py
+++ b/userale/examples/__init__.py
@@ -0,0 +1,14 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
\ No newline at end of file
diff --git a/userale/examples/testapp.py b/userale/examples/testapp.py
index 443cf83..e30d4f3 100644
--- a/userale/examples/testapp.py
+++ b/userale/examples/testapp.py
@@ -1,12 +1,11 @@
-# -*- coding: utf-8 -*-
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
 #
-# Copyright 2016 The Charles Stark Draper Laboratory, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
+#   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
@@ -44,7 +43,7 @@
     app = QApplication(sys.argv)    
     app.setObjectName ("testApplication")
     ex = TestApplication()
-    ale = Ale (output="mouse.log", user="testUser", version="0.0.1")
+    ale = Ale (output="mouse.log", user="testUser", toolname="mousetest", toolversion="0.0.1")
     # install globally
     app.installEventFilter (ale)
 
diff --git a/userale/examples/testclose.py b/userale/examples/testclose.py
index 9edf142..0daef24 100644
--- a/userale/examples/testclose.py
+++ b/userale/examples/testclose.py
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 """
 ZetCode PyQt5 tutorial 
 
diff --git a/userale/examples/testdragndrop.py b/userale/examples/testdragndrop.py
index 005f410..67db2e5 100644
--- a/userale/examples/testdragndrop.py
+++ b/userale/examples/testdragndrop.py
@@ -1,4 +1,17 @@
-# -*- coding: utf-8 -*-
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 
 """
 ZetCode PyQt5 tutorial
@@ -58,12 +71,13 @@
         
         self.setWindowTitle('Simple drag & drop')
         self.setGeometry(300, 300, 300, 150)
-
+        self.setObjectName ("examplewidget1")
 
 def test_drag ():
     app = QApplication(sys.argv)
+    app.setObjectName ("dragApplication")
     # Turn off mouse click's and keylogging
-    ale = Ale (shutoff=['mousemove', 'dragmove'], keylog=True)
+    ale = Ale (shutoff=['mousemove', 'mousedown', 'dragmove'], keylog=True)
     # install globally
     app.installEventFilter (ale)
     ex = ExampleWidget()
diff --git a/userale/examples/testdragndrop2.py b/userale/examples/testdragndrop2.py
index c5f74a9..0a8fd58 100644
--- a/userale/examples/testdragndrop2.py
+++ b/userale/examples/testdragndrop2.py
@@ -1,4 +1,17 @@
-# -*- coding: utf-8 -*-
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 
 """
 ZetCode PyQt5 tutorial
@@ -82,7 +95,7 @@
 def test_drag2 ():
     app = QApplication(sys.argv)
     ex = Example()
-    ale = Ale ()
+    ale = Ale (output="drag2.log", user="testUser", toolname="dragtest", toolversion="0.0.1")
     # install globally
     app.installEventFilter (ale)
     ex.show()
diff --git a/userale/examples/testwindowflags.py b/userale/examples/testwindowflags.py
new file mode 100644
index 0000000..a02af7e
--- /dev/null
+++ b/userale/examples/testwindowflags.py
@@ -0,0 +1,261 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from PyQt5.QtCore import Qt
+from PyQt5.QtWidgets import (QApplication, QCheckBox, QGridLayout, QGroupBox,
+        QHBoxLayout, QPushButton, QRadioButton, QTextEdit, QVBoxLayout,
+        QWidget)
+
+from userale.ale import Ale
+
+
+class PreviewWindow(QWidget):
+    def __init__(self, parent=None):
+        super(PreviewWindow, self).__init__(parent)
+
+        self.textEdit = QTextEdit()
+        self.textEdit.setReadOnly(True)
+        self.textEdit.setLineWrapMode(QTextEdit.NoWrap)
+
+        closeButton = QPushButton("&Close")
+        closeButton.clicked.connect(self.close)
+
+        layout = QVBoxLayout()
+        layout.addWidget(self.textEdit)
+        layout.addWidget(closeButton)
+        self.setLayout(layout)
+
+        self.setWindowTitle("Preview")
+
+    def setWindowFlags(self, flags):
+        super(PreviewWindow, self).setWindowFlags(flags)
+
+        flag_type = (flags & Qt.WindowType_Mask)
+
+        if flag_type == Qt.Window:
+            text = "Qt.Window"
+        elif flag_type == Qt.Dialog:
+            text = "Qt.Dialog"
+        elif flag_type == Qt.Sheet:
+            text = "Qt.Sheet"
+        elif flag_type == Qt.Drawer:
+            text = "Qt.Drawer"
+        elif flag_type == Qt.Popup:
+            text = "Qt.Popup"
+        elif flag_type == Qt.Tool:
+            text = "Qt.Tool"
+        elif flag_type == Qt.ToolTip:
+            text = "Qt.ToolTip"
+        elif flag_type == Qt.SplashScreen:
+            text = "Qt.SplashScreen"
+        else:
+            text = ""
+
+        if flags & Qt.MSWindowsFixedSizeDialogHint:
+            text += "\n| Qt.MSWindowsFixedSizeDialogHint"
+        if flags & Qt.X11BypassWindowManagerHint:
+            text += "\n| Qt.X11BypassWindowManagerHint"
+        if flags & Qt.FramelessWindowHint:
+            text += "\n| Qt.FramelessWindowHint"
+        if flags & Qt.WindowTitleHint:
+            text += "\n| Qt.WindowTitleHint"
+        if flags & Qt.WindowSystemMenuHint:
+            text += "\n| Qt.WindowSystemMenuHint"
+        if flags & Qt.WindowMinimizeButtonHint:
+            text += "\n| Qt.WindowMinimizeButtonHint"
+        if flags & Qt.WindowMaximizeButtonHint:
+            text += "\n| Qt.WindowMaximizeButtonHint"
+        if flags & Qt.WindowCloseButtonHint:
+            text += "\n| Qt.WindowCloseButtonHint"
+        if flags & Qt.WindowContextHelpButtonHint:
+            text += "\n| Qt.WindowContextHelpButtonHint"
+        if flags & Qt.WindowShadeButtonHint:
+            text += "\n| Qt.WindowShadeButtonHint"
+        if flags & Qt.WindowStaysOnTopHint:
+            text += "\n| Qt.WindowStaysOnTopHint"
+        if flags & Qt.WindowStaysOnBottomHint:
+            text += "\n| Qt.WindowStaysOnBottomHint"
+        if flags & Qt.CustomizeWindowHint:
+            text += "\n| Qt.CustomizeWindowHint"
+
+        self.textEdit.setPlainText(text)
+
+
+class ControllerWindow(QWidget):
+    def __init__(self):
+        super(ControllerWindow, self).__init__()
+
+        self.previewWindow = PreviewWindow(self)
+
+        self.createTypeGroupBox()
+        self.createHintsGroupBox()
+
+        quitButton = QPushButton("&Quit")
+        quitButton.clicked.connect(self.close)
+
+        bottomLayout = QHBoxLayout()
+        bottomLayout.addStretch()
+        bottomLayout.addWidget(quitButton)
+
+        mainLayout = QVBoxLayout()
+        mainLayout.addWidget(self.typeGroupBox)
+        mainLayout.addWidget(self.hintsGroupBox)
+        mainLayout.addLayout(bottomLayout)
+        self.setLayout(mainLayout)
+
+        self.setWindowTitle("Window Flags")
+        self.updatePreview()
+
+    def updatePreview(self):
+        flags = Qt.WindowFlags()
+
+        if self.windowRadioButton.isChecked():
+            flags = Qt.Window
+        elif self.dialogRadioButton.isChecked():
+            flags = Qt.Dialog
+        elif self.sheetRadioButton.isChecked():
+            flags = Qt.Sheet
+        elif self.drawerRadioButton.isChecked():
+            flags = Qt.Drawer
+        elif self.popupRadioButton.isChecked():
+            flags = Qt.Popup
+        elif self.toolRadioButton.isChecked():
+            flags = Qt.Tool
+        elif self.toolTipRadioButton.isChecked():
+            flags = Qt.ToolTip
+        elif self.splashScreenRadioButton.isChecked():
+            flags = Qt.SplashScreen
+
+        if self.msWindowsFixedSizeDialogCheckBox.isChecked():
+            flags |= Qt.MSWindowsFixedSizeDialogHint            
+        if self.x11BypassWindowManagerCheckBox.isChecked():
+            flags |= Qt.X11BypassWindowManagerHint
+        if self.framelessWindowCheckBox.isChecked():
+            flags |= Qt.FramelessWindowHint
+        if self.windowTitleCheckBox.isChecked():
+            flags |= Qt.WindowTitleHint
+        if self.windowSystemMenuCheckBox.isChecked():
+            flags |= Qt.WindowSystemMenuHint
+        if self.windowMinimizeButtonCheckBox.isChecked():
+            flags |= Qt.WindowMinimizeButtonHint
+        if self.windowMaximizeButtonCheckBox.isChecked():
+            flags |= Qt.WindowMaximizeButtonHint
+        if self.windowCloseButtonCheckBox.isChecked():
+            flags |= Qt.WindowCloseButtonHint
+        if self.windowContextHelpButtonCheckBox.isChecked():
+            flags |= Qt.WindowContextHelpButtonHint
+        if self.windowShadeButtonCheckBox.isChecked():
+            flags |= Qt.WindowShadeButtonHint
+        if self.windowStaysOnTopCheckBox.isChecked():
+            flags |= Qt.WindowStaysOnTopHint
+        if self.windowStaysOnBottomCheckBox.isChecked():
+            flags |= Qt.WindowStaysOnBottomHint
+        if self.customizeWindowHintCheckBox.isChecked():
+            flags |= Qt.CustomizeWindowHint
+
+        self.previewWindow.setWindowFlags(flags)
+
+        pos = self.previewWindow.pos()
+
+        if pos.x() < 0:
+            pos.setX(0)
+
+        if pos.y() < 0:
+            pos.setY(0)
+
+        self.previewWindow.move(pos)
+        self.previewWindow.show()
+
+    def createTypeGroupBox(self):
+        self.typeGroupBox = QGroupBox("Type")
+
+        self.windowRadioButton = self.createRadioButton("Window")
+        self.dialogRadioButton = self.createRadioButton("Dialog")
+        self.sheetRadioButton = self.createRadioButton("Sheet")
+        self.drawerRadioButton = self.createRadioButton("Drawer")
+        self.popupRadioButton = self.createRadioButton("Popup")
+        self.toolRadioButton = self.createRadioButton("Tool")
+        self.toolTipRadioButton = self.createRadioButton("Tooltip")
+        self.splashScreenRadioButton = self.createRadioButton("Splash screen")
+        self.windowRadioButton.setChecked(True)
+
+        layout = QGridLayout()
+        layout.addWidget(self.windowRadioButton, 0, 0)
+        layout.addWidget(self.dialogRadioButton, 1, 0)
+        layout.addWidget(self.sheetRadioButton, 2, 0)
+        layout.addWidget(self.drawerRadioButton, 3, 0)
+        layout.addWidget(self.popupRadioButton, 0, 1)
+        layout.addWidget(self.toolRadioButton, 1, 1)
+        layout.addWidget(self.toolTipRadioButton, 2, 1)
+        layout.addWidget(self.splashScreenRadioButton, 3, 1)
+        self.typeGroupBox.setLayout(layout)
+
+    def createHintsGroupBox(self):
+        self.hintsGroupBox = QGroupBox("Hints")
+
+        self.msWindowsFixedSizeDialogCheckBox = self.createCheckBox("MS Windows fixed size dialog")
+        self.x11BypassWindowManagerCheckBox = self.createCheckBox("X11 bypass window manager")
+        self.framelessWindowCheckBox = self.createCheckBox("Frameless window")
+        self.windowTitleCheckBox = self.createCheckBox("Window title")
+        self.windowSystemMenuCheckBox = self.createCheckBox("Window system menu")
+        self.windowMinimizeButtonCheckBox = self.createCheckBox("Window minimize button")
+        self.windowMaximizeButtonCheckBox = self.createCheckBox("Window maximize button")
+        self.windowCloseButtonCheckBox = self.createCheckBox("Window close button")
+        self.windowContextHelpButtonCheckBox = self.createCheckBox("Window context help button")
+        self.windowShadeButtonCheckBox = self.createCheckBox("Window shade button")
+        self.windowStaysOnTopCheckBox = self.createCheckBox("Window stays on top")
+        self.windowStaysOnBottomCheckBox = self.createCheckBox("Window stays on bottom")
+        self.customizeWindowHintCheckBox = self.createCheckBox("Customize window")
+
+        layout = QGridLayout()
+        layout.addWidget(self.msWindowsFixedSizeDialogCheckBox, 0, 0)
+        layout.addWidget(self.x11BypassWindowManagerCheckBox, 1, 0)
+        layout.addWidget(self.framelessWindowCheckBox, 2, 0)
+        layout.addWidget(self.windowTitleCheckBox, 3, 0)
+        layout.addWidget(self.windowSystemMenuCheckBox, 4, 0)
+        layout.addWidget(self.windowMinimizeButtonCheckBox, 0, 1)
+        layout.addWidget(self.windowMaximizeButtonCheckBox, 1, 1)
+        layout.addWidget(self.windowCloseButtonCheckBox, 2, 1)
+        layout.addWidget(self.windowContextHelpButtonCheckBox, 3, 1)
+        layout.addWidget(self.windowShadeButtonCheckBox, 4, 1)
+        layout.addWidget(self.windowStaysOnTopCheckBox, 5, 1)
+        layout.addWidget(self.windowStaysOnBottomCheckBox, 6, 1)
+        layout.addWidget(self.customizeWindowHintCheckBox, 5, 0)
+        self.hintsGroupBox.setLayout(layout)
+
+    def createCheckBox(self, text):
+        checkBox = QCheckBox(text)
+        checkBox.clicked.connect(self.updatePreview)
+        return checkBox
+
+    def createRadioButton(self, text):
+        button = QRadioButton(text)
+        button.clicked.connect(self.updatePreview)
+        return button
+
+
+def test_controller ():
+    import sys
+
+    app = QApplication(sys.argv)
+    controller = ControllerWindow()
+
+    # Initiate UserAle
+    ale = Ale(output='window.log', user='testuser', toolname="Controller", toolversion="0.0.1", shutoff=["mousemove", "mouseleave", "mouseenter"])
+    # install globally
+    app.installEventFilter(ale)
+
+    controller.show()
+    sys.exit(app.exec_())
\ No newline at end of file
diff --git a/userale/format.py b/userale/format.py
index aeeb6ba..7b1c750 100644
--- a/userale/format.py
+++ b/userale/format.py
@@ -1,10 +1,11 @@
-# Copyright 2016 The Charles Stark Draper Laboratory, Inc.
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
 #
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
+#   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
@@ -21,11 +22,11 @@
 # Logger will need to optinally handle authorization 
 # through basic http auth, proxy, and SOCKS
 
-class StructuredMessage (object):
+class JsonFormatter (object):
 	"""
 	"""
 	def __init__(self, data):
 		self.data = data
 
 	def __str__(self):
-		return '%s' % (json.dumps (self.data, sort_keys=False, indent=4))
+		return "%s" % (json.dumps (self.data, sort_keys=False))
diff --git a/userale/version.py b/userale/version.py
index 8fb4bc6..48782d9 100644
--- a/userale/version.py
+++ b/userale/version.py
@@ -1,10 +1,11 @@
-# Copyright 2016 The Charles Stark Draper Laboratory, Inc.
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
 #
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
+#   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
@@ -18,4 +19,4 @@
 and parsed by ``setup.py``.
 """
 
-__version__ = "1.0.4"
\ No newline at end of file
+__version__ = "0.1.5"
\ No newline at end of file