diff --git a/README.md b/README.md
index 2ffdf99..5d2773a 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,21 @@
+<!--
+ * 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.
+-->
+
 For more information on weinre:
 [http://callback.github.com/callback-weinre/](http://callback.github.com/callback-weinre/)
\ No newline at end of file
diff --git a/weinre.application/resources/macosx/weinre.app/Contents/Info.plist b/weinre.application/resources/macosx/weinre.app/Contents/Info.plist
index 3e8310a..f1b4861 100644
--- a/weinre.application/resources/macosx/weinre.app/Contents/Info.plist
+++ b/weinre.application/resources/macosx/weinre.app/Contents/Info.plist
@@ -2,10 +2,22 @@
 <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
 -->
 
 <plist version="1.0">
diff --git a/weinre.application/resources/macosx/weinre.app/Contents/MacOS/launcher b/weinre.application/resources/macosx/weinre.app/Contents/MacOS/launcher
index ffc287d..f76ffc5 100644
--- a/weinre.application/resources/macosx/weinre.app/Contents/MacOS/launcher
+++ b/weinre.application/resources/macosx/weinre.app/Contents/MacOS/launcher
@@ -1,10 +1,22 @@
 #!/bin/sh
 
 # ---
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
-# 
-# Copyright (c) 2010, 2011 IBM Corporation
+# 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.
 # ---
 
 BASEDIR=`dirname $0`
diff --git a/weinre.application/src/weinre/application/GUIMain.java b/weinre.application/src/weinre/application/GUIMain.java
index 7ae91a4..28208ff 100644
--- a/weinre.application/src/weinre/application/GUIMain.java
+++ b/weinre.application/src/weinre/application/GUIMain.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.application;
@@ -42,7 +54,7 @@
     private Color            red;
     private GUIPreferences   preferences;
     private ShellSizeTracker shellSizeTracker;
-    
+
     //---------------------------------------------------------------
     static public void main(String[] args) {
         GUIMain main = new GUIMain(args);
@@ -52,10 +64,10 @@
     //---------------------------------------------------------------
     private GUIMain(String[] args) {
         super(args);
-        
+
         preferences = new GUIPreferences();
     }
-    
+
     //---------------------------------------------------------------
     @Override
     public void run() {
@@ -66,11 +78,11 @@
                 httpServerStart();
             }
         };
-        
+
         new Thread(serverRunnable, "main server thread").start();
 
         uiRun();
-        
+
         exit();
     }
 
@@ -93,15 +105,15 @@
     @Override
     public void addServerConsoleMessage(final String line, final boolean stdout) {
         if (null == console) return;
-        
+
         if (console.isDisposed()) return;
-        
+
         console.getDisplay().asyncExec(new Runnable() {
            public void run() {
                if (console.isDisposed()) return;
-               
+
                String theLine = line + Text.DELIMITER;
-               
+
                Color color = null;
                if (!stdout) color = red;
 
@@ -109,19 +121,19 @@
                styleRange.start      = console.getCharCount();
                styleRange.length     = theLine.length();
                styleRange.foreground = color;
-               
+
                console.append(theLine);
                console.setStyleRange(styleRange);
            }
         });
     }
-    
+
     //---------------------------------------------------------------
     @Override
     public int severeError(final String message) {
         if (null == display) return super.severeError(message);
         if (display.isDisposed()) return super.severeError(message);
-        
+
         display.syncExec(new Runnable() {
            public void run() {
                boolean noGUI = false;
@@ -129,12 +141,12 @@
                if (null == shell)        noGUI = true;
                if (display.isDisposed()) noGUI = true;
                if (shell.isDisposed())   noGUI = true;
-               
+
                if (noGUI) {
                    GUIMain.super.severeError(message);
                    return;
                }
-               
+
                MessageBox messageBox = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
                messageBox.setMessage(message);
                messageBox.setText("weinre exiting");
@@ -142,22 +154,22 @@
                exit();
            }
         });
-        
+
         return 0;
     }
-    
+
     //---------------------------------------------------------------
     private void uiBuild() {
         Display.setAppName("weinre");
         Display.setAppVersion("???");
-        
+
         display = new Display();
         shell   = new Shell(display);
-        
+
         red = new Color(display, 255, 0, 0);
 
         shell.setText("weinre - Web Inspector Remote");
-        
+
         CTabFolder tabFolder       = new CTabFolder(shell, SWT.BORDER | SWT.BOTTOM);
         CTabItem   tabItemDebugger = createTabItem(tabFolder, "Debugger");
         CTabItem   tabItemConsole  = createTabItem(tabFolder, "Server Console");
@@ -165,31 +177,31 @@
 
         debugger = new Browser(tabFolder, SWT.NONE);
         tabItemDebugger.setControl(debugger);
-        
+
         console = new StyledText(tabFolder, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
         console.setEditable(false);
         console.setFont(getMonospaceFont(console));
 
         homePage = new Browser(tabFolder, SWT.NONE);
         tabItemHomePage.setControl(homePage);
-        
+
         tabItemConsole.setControl(console);
-        
+
         fillParent(debugger,  0, 0, 0, 0);
         fillParent(console,   0, 0, 0, 0);
         fillParent(homePage,  0, 0, 0, 0);
         fillParent(tabFolder, 5, 5, 5, 5);
-        
+
         tabFolder.pack();
         createMenuBar();
-        
+
         shellSizeTracker = new ShellSizeTracker("main", shell, preferences);
         shellSizeTracker.start();
-        
+
         try {
             String       boundsKey = ShellSizeTracker.getBoundsKey(shell, "main");
             JSONObject   bounds    = preferences.getPreference(boundsKey);
-            
+
             if (null != bounds) {
                 Integer x, y, w, h;
                 try {
@@ -200,23 +212,23 @@
                 } catch (JSONException e) {
                     throw new RuntimeException(e);
                 }
-                
+
                 if ((null != w) && (null != h)) {
                     shell.setBounds(x,y,w,h);
                 }
             }
-            
+
             else {
                 shell.setBounds(100, 100, 700, 500);
             }
-            
+
         }
         catch (IOException e) {
             Main.warn("exception reading preferences: " + e);
         }
-        
+
     }
- 
+
     //---------------------------------------------------------------
     private void createMenuBar() {
 //        Menu menu = new Menu(shell, SWT.BAR);
@@ -225,12 +237,12 @@
 //        fileMenuItem.setText("File");
 //        MenuItem editMenuItem = new MenuItem(menu, SWT.CASCADE);
 //        editMenuItem.setText("Edit");
-     }        
+     }
 
     //---------------------------------------------------------------
     private void uiRun() {
         shell.open();
-        
+
         while (!shell.isDisposed()) {
             if (!display.readAndDispatch())
                 display.sleep();
@@ -242,32 +254,32 @@
     private CTabItem createTabItem(CTabFolder tabFolder, String text) {
         CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
         tabItem.setText(text);
-        
+
         Font       font     = tabItem.getFont();
         FontData[] fontData = font.getFontData();
-        
+
         for (FontData fontDatum: fontData) {
             double newHeight = fontDatum.getHeight() * 1.25;
             fontDatum.setHeight((int) newHeight);
         }
-        
+
         font = new Font(display, fontData);
         tabItem.setFont(font);
-        
+
         return tabItem;
     }
-    
+
     //---------------------------------------------------------------
     private void fillParent(Control control, int marginT, int marginR, int marginB, int marginL ) {
         FormLayout formLayout = new FormLayout();
-        
-        formLayout.marginTop    = marginT; 
+
+        formLayout.marginTop    = marginT;
         formLayout.marginBottom = marginB;
         formLayout.marginLeft   = marginL;
         formLayout.marginRight  = marginR;
-        
+
         FormData formData = new FormData();
-        
+
         formData.left     = new FormAttachment(0);
         formData.right    = new FormAttachment(100);
         formData.top      = new FormAttachment(0);
@@ -276,27 +288,27 @@
         control.getParent().setLayout(formLayout);
         control.setLayoutData(formData);
     }
-    
+
     //---------------------------------------------------------------
     private String getBrowserURL() {
         String result;
-        
+
         ServerSettings settings = weinre.server.Main.getSettings();
-        
+
         String host = settings.getNiceHostName();
         int    port = settings.getHttpPort();
-        
+
         result = "http://" + host + ":" + port + "/";
-        
+
         return result;
     }
-    
+
     //---------------------------------------------------------------
     private Font getMonospaceFont(Control control) {
         FontData[] fontData = control.getDisplay().getFontList(null, true);
-        
+
         FontData fontFound = null;
-        
+
         // essentially the defaults that web inspector uses
         if (null == fontFound) fontFound = findFontNamed(fontData, "Menlo");
         if (null == fontFound) fontFound = findFontNamed(fontData, "Monaco");
@@ -304,39 +316,39 @@
         if (null == fontFound) fontFound = findFontNamed(fontData, "Lucida Console");
         if (null == fontFound) fontFound = findFontNamed(fontData, "dejavu sans mono");
         if (null == fontFound) fontFound = findFontNamed(fontData, "Courier");
-        
+
         if (null == fontFound) return null;
 
         fontFound.setHeight(14);
-        
+
         return new Font(control.getDisplay(), fontFound);
     }
-    
+
     //---------------------------------------------------------------
     private FontData findFontNamed(FontData[] fontData, String name) {
         for (FontData fontDatum: fontData) {
             if (fontDatum.getStyle() != SWT.NORMAL) continue;
-            if (name.equals(fontDatum.getName())) return fontDatum; 
+            if (name.equals(fontDatum.getName())) return fontDatum;
         }
-        
+
         return null;
     }
-    
+
     //---------------------------------------------------------------
     @SuppressWarnings("unused")
     private void dumpFontData(FontData[] fontData) {
         for (FontData fontDatum: fontData) {
             int    style       = fontDatum.getStyle();
             String styleString = "";
-            
+
             if (0 != (style & SWT.NORMAL)) styleString += "NORMAL ";
             if (0 != (style & SWT.BOLD))   styleString += "BOLD ";
             if (0 != (style & SWT.ITALIC)) styleString += "ITALIC ";
-            
+
             styleString = styleString.trim();
-            
+
             System.out.println("font: " + fontDatum.getName() + " : " + fontDatum.getHeight() + " : " + styleString);
         }
     }
-    
+
 }
diff --git a/weinre.application/src/weinre/application/GUIPreferences.java b/weinre.application/src/weinre/application/GUIPreferences.java
index 200ea0a..3751584 100644
--- a/weinre.application/src/weinre/application/GUIPreferences.java
+++ b/weinre.application/src/weinre/application/GUIPreferences.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.application;
@@ -19,16 +31,16 @@
 //-------------------------------------------------------------------
 public class GUIPreferences {
     static final private String PROPERTIES_FILE_NAME = "ui.properties";
-    
+
     private Properties properties;
-    
+
     //---------------------------------------------------------------
     public GUIPreferences() {
         super();
 
         properties = Utility.readPropertiesFile(PROPERTIES_FILE_NAME);
     }
-    
+
     //---------------------------------------------------------------
     public JSONObject getPreference(String key) throws IOException {
         String val = properties.getProperty(key);
@@ -40,11 +52,11 @@
             throw new RuntimeException(e);
         }
     }
-    
+
     //---------------------------------------------------------------
     public void setPreference(String key, JSONObject json) {
         String val = json.toString();
-        
+
         properties.setProperty(key, val);
         Utility.writePropertiesFile(PROPERTIES_FILE_NAME, properties);
     }
diff --git a/weinre.application/src/weinre/application/ShellSizeTracker.java b/weinre.application/src/weinre/application/ShellSizeTracker.java
index 5fbad4b..e5d8972 100644
--- a/weinre.application/src/weinre/application/ShellSizeTracker.java
+++ b/weinre.application/src/weinre/application/ShellSizeTracker.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.application;
@@ -31,9 +43,9 @@
 
     //---------------------------------------------------------------
     static public String getBoundsKey(Shell shell, String name) {
-        return "bounds-" + name + "-" + ShellSizeTracker.getMonitorSetupKey(shell.getDisplay());        
+        return "bounds-" + name + "-" + ShellSizeTracker.getMonitorSetupKey(shell.getDisplay());
     }
-    
+
     //---------------------------------------------------------------
     static private String getMonitorSetupKey(final Display display) {
         StringBuffer keyBuffer = new StringBuffer();
@@ -42,29 +54,29 @@
         for (Monitor monitor: monitors) {
             Rectangle bounds     = monitor.getBounds();
             Rectangle clientArea = monitor.getClientArea();
-            
+
             keyBuffer.append("__");
             keyBuffer.append(bounds.x);      keyBuffer.append("_");
             keyBuffer.append(bounds.y);      keyBuffer.append("_");
             keyBuffer.append(bounds.width);  keyBuffer.append("_");
             keyBuffer.append(bounds.height);
-            
+
             keyBuffer.append("__");
             keyBuffer.append(clientArea.x);      keyBuffer.append("_");
             keyBuffer.append(clientArea.y);      keyBuffer.append("_");
             keyBuffer.append(clientArea.width);  keyBuffer.append("_");
-            keyBuffer.append(clientArea.height); 
+            keyBuffer.append(clientArea.height);
         }
 
         keyBuffer.insert(0, "monitor-setup");
-        
+
         return keyBuffer.toString();
     }
-    
+
     //---------------------------------------------------------------
     public ShellSizeTracker(String name, final Shell shell, GUIPreferences preferences) {
         super();
-        
+
         this.name         = name;
         this.shell        = shell;
         this.preferences  = preferences;
@@ -72,24 +84,24 @@
         this.lastSize     = new Point(0,0);
         this.lastLocation = new Point(0,0);
         this.stop         = false;
-        
+
         shell.addControlListener(new ControlListener() {
             public void controlMoved(ControlEvent e)   {shellMoved();}
             public void controlResized(ControlEvent e) {shellMoved();}
         });
-        
+
     }
 
     //---------------------------------------------------------------
     public void start() {
         startWaiterThread();
     }
-    
+
     //---------------------------------------------------------------
     public void stop() {
-        
+
     }
-    
+
     //---------------------------------------------------------------
     private void shellMoved() {
         dirty        = true;
@@ -103,9 +115,9 @@
         if (!dirty) return;
         if (shell.isDisposed()) return;
         if (System.currentTimeMillis() < lastChange + 3000) return;
-        
+
         JSONObject valueJSON = new JSONObject();
-        
+
         try {
             valueJSON.put("x", lastLocation.x);
             valueJSON.put("y", lastLocation.y);
@@ -114,10 +126,10 @@
         } catch (JSONException e1) {
             throw new RuntimeException(e1);
         }
-        
+
         String key;
         key = ShellSizeTracker.getBoundsKey(shell, name);
-        
+
         preferences.setPreference(key, valueJSON);
 
         dirty = false;
@@ -130,20 +142,20 @@
             public void run() {
                 while (true) {
                     try { Thread.sleep(1000); } catch(InterruptedException e) { return; }
-                    
+
                     if (stop) return;
                     if (shell.isDisposed()) return;
-                    
+
                     shell.getDisplay().asyncExec(new Runnable() {
                         public void run() { checkForChanges(); }
                     });
                 }
             }
         };
-        
+
         Thread thread = new Thread(runnable, getClass().getSimpleName() + " for " + name);
         thread.start();
-        
+
         return thread;
     }
 
diff --git a/weinre.build/README.md b/weinre.build/README.md
index e7a43c9..e47c046 100644
--- a/weinre.build/README.md
+++ b/weinre.build/README.md
@@ -1,3 +1,22 @@
+<!--
+ * 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.
+-->
+
 building weinre
 ===============================================================================
 
diff --git a/weinre.build/build-continuous.sh b/weinre.build/build-continuous.sh
index 8d451a5..e6f1181 100755
--- a/weinre.build/build-continuous.sh
+++ b/weinre.build/build-continuous.sh
@@ -1,10 +1,22 @@
 #!/bin/sh
 
 # ---
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
-# 
-# Copyright (c) 2010, 2011 IBM Corporation
+# 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.
 # ---
 
 #-------------------------------------------------------------
@@ -26,4 +38,4 @@
   ../weinre.doc \
   ../weinre.server \
   ../weinre.web
-  
+
diff --git a/weinre.build/build.properties b/weinre.build/build.properties
index 6972e2d..8cb1b96 100644
--- a/weinre.build/build.properties
+++ b/weinre.build/build.properties
@@ -1,8 +1,20 @@
 # ---
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 # ---
 
 #-----------------------------------------------------------
diff --git a/weinre.build/build.xml b/weinre.build/build.xml
index 7e72ae8..eab7546 100644
--- a/weinre.build/build.xml
+++ b/weinre.build/build.xml
@@ -1,8 +1,20 @@
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <project name="build" default="build" basedir=".">
diff --git a/weinre.build/debug.sh b/weinre.build/debug.sh
index 3542f2d..ba681ee 100755
--- a/weinre.build/debug.sh
+++ b/weinre.build/debug.sh
@@ -1,4 +1,24 @@
 #!/bin/sh
+
+# ---
+# 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.
+# ---
+
 CWD=`dirname $0`
 WEINRE=`dirname $CWD`
 CP=$WEINRE/weinre.server/bin:$WEINRE/weinre.build/out:$WEINRE/weinre.build/vendor/cli/commons-cli.jar:$WEINRE/weinre.build/vendor/jetty/jetty.jar:$WEINRE/weinre.build/vendor/json4j/json4j.jar:$WEINRE/weinre.build/vendor/jetty/servlet-api.jar
diff --git a/weinre.build/get-vendor.xml b/weinre.build/get-vendor.xml
index 259dfaf..e420835 100644
--- a/weinre.build/get-vendor.xml
+++ b/weinre.build/get-vendor.xml
@@ -1,8 +1,20 @@
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <project name="get-vendor" default="get-vendor" basedir=".">
diff --git a/weinre.build/new-release-notes.md b/weinre.build/new-release-notes.md
index 937c66f..46f9a71 100644
--- a/weinre.build/new-release-notes.md
+++ b/weinre.build/new-release-notes.md
@@ -1,3 +1,22 @@
+<!--
+ * 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.
+-->
+
 steps to create a new release
 ===============================================================================
 
@@ -40,7 +59,7 @@
    - `git checkout develop`
    - `git merge --no-ff release-x.y.z`
    - `git push`
-   - `git branch -d release-x.y.z`   
+   - `git branch -d release-x.y.z`
 
 - update github pages:
 
diff --git a/weinre.build/sample.personal.properties b/weinre.build/sample.personal.properties
index 22f7204..73c2d6e 100644
--- a/weinre.build/sample.personal.properties
+++ b/weinre.build/sample.personal.properties
@@ -1,8 +1,20 @@
 # ---
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 # ---
 
 #------------------------------------------------------------------------------
diff --git a/weinre.build/scripts/build-client-html.py b/weinre.build/scripts/build-client-html.py
index a06fc05..86bb0ff 100644
--- a/weinre.build/scripts/build-client-html.py
+++ b/weinre.build/scripts/build-client-html.py
@@ -1,10 +1,22 @@
 #!/usr/bin/env python
 
 # ---
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 # ---
 
 import os
diff --git a/weinre.build/scripts/build-css-properties.py b/weinre.build/scripts/build-css-properties.py
index c6fde75..4ac4122 100644
--- a/weinre.build/scripts/build-css-properties.py
+++ b/weinre.build/scripts/build-css-properties.py
@@ -1,10 +1,22 @@
 #!/usr/bin/env python
 
 # ---
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 # ---
 
 import os
diff --git a/weinre.build/scripts/build-target-scripts.py b/weinre.build/scripts/build-target-scripts.py
index 64d1923..721ea26 100644
--- a/weinre.build/scripts/build-target-scripts.py
+++ b/weinre.build/scripts/build-target-scripts.py
@@ -1,10 +1,22 @@
 #!/usr/bin/env python
 
 # ---
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 # ---
 
 import os
diff --git a/weinre.build/scripts/changelog.sh b/weinre.build/scripts/changelog.sh
index af3a12f..8c7393a 100755
--- a/weinre.build/scripts/changelog.sh
+++ b/weinre.build/scripts/changelog.sh
@@ -1,10 +1,22 @@
 #/bin/sh
 
 # ---
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
-# 
-# Copyright (c) 2011 IBM Corporation
+# 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.
 # ---
 
 git log "--pretty=format:- %s" $1.. | \
diff --git a/weinre.build/scripts/closed-issues.py b/weinre.build/scripts/closed-issues.py
index 8eda3ab..4fe32de 100755
--- a/weinre.build/scripts/closed-issues.py
+++ b/weinre.build/scripts/closed-issues.py
@@ -1,5 +1,24 @@
 #!/usr/bin/env python
 
+# ---
+# 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.
+# ---
+
 import os
 import sys
 import json
@@ -8,7 +27,7 @@
 if len(sys.argv) < 3:
     print "expecting parameters <user> <project>"
     sys.exit()
-    
+
 user = sys.argv[1]
 proj = sys.argv[2]
 
@@ -28,6 +47,6 @@
     number = issue["number"]
     title  = issue["title"]
     date   = issue["closed_at"]
-    
+
     template = "<li><a href='https://github.com/%s/%s/issues/%d'>issue %d</a> %s - %s"
     print template % (user, proj, number, number, date, title)
\ No newline at end of file
diff --git a/weinre.build/scripts/collect-all-json-idl.py b/weinre.build/scripts/collect-all-json-idl.py
index 2d1d912..9448915 100644
--- a/weinre.build/scripts/collect-all-json-idl.py
+++ b/weinre.build/scripts/collect-all-json-idl.py
@@ -1,10 +1,22 @@
 #!/usr/bin/env python
 
 # ---
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 # ---
 
 import os
diff --git a/weinre.build/scripts/simple-idl2json.py b/weinre.build/scripts/simple-idl2json.py
index b5cf521..fceec8a 100644
--- a/weinre.build/scripts/simple-idl2json.py
+++ b/weinre.build/scripts/simple-idl2json.py
@@ -1,10 +1,22 @@
 #!/usr/bin/env python
 
 # ---
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
-# 
-# Copyright (c) 2010, 2011 IBM Corporation
+# 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.
 # ---
 
 import os
@@ -19,34 +31,34 @@
 
 #--------------------------------------------------------------------
 def main():
-    
+
     # parse args
     parser = optparse.OptionParser()
     parser.add_option("--validate",  action="store_true",                 help="validate types")
     parser.add_option("--anyType",   action="append",     metavar="TYPE", help="treat TYPE as an any")
     (options, args) = parser.parse_args()
-    
+
     if options.anyType:
         AnyTypes.extend(options.anyType)
-    
+
     if len(args) <= 0: error("no input files specified")
     iFileName = args[0]
-    
-    if len(args) <= 1: 
+
+    if len(args) <= 1:
         oFileName = "<stdout>"
     else:
         oFileName = args[1]
-    
+
     # read input
     iFile = file(iFileName)
     content = iFile.read()
     iFile.close()
-        
+
     # convert to JSONable
     module = parseIDL(content)
-    
+
     splitNotifyInterfaces(module)
-    
+
 #    if module["name"] == "core":
 #        if len(module["interfaces"]) == 1:
 #            if module["interfaces"][0]["name"] == "Inspector":
@@ -54,57 +66,57 @@
 
     # convert out parms to callback parms
     convertOutParms(module)
-    
+
     # validate
     if options.validate: validate(module)
 
     # convert to JSON
     jsonModule = json.dumps(module, indent=3)
-    
+
     # write output
-    if oFileName == "<stdout>": 
+    if oFileName == "<stdout>":
         oFile = sys.stdout
     else:
         oFile = file(oFileName,"w")
-        
+
     oFile.write(jsonModule)
 
     # close file
-    if oFileName != "<stdout>": 
+    if oFileName != "<stdout>":
         oFile.close()
         log("generated json file '%s'" %oFileName)
 
 #--------------------------------------------------------------------
 def convertOutParms(module):
     for interface in module["interfaces"]:
-        
+
         if "methods" in interface:
             for method in interface["methods"]:
                 method["callbackParameters"] = []
                 newParameters = []
-                
+
                 for parameter in method["parameters"]:
                     if "out" in parameter:
                         method["callbackParameters"].append(parameter)
                     else:
                         newParameters.append(parameter)
-                        
+
                 method["parameters"] = newParameters
 
 #--------------------------------------------------------------------
 def splitNotifyInterfaces(module):
     newInterfaces = {}
-    
+
     for interface in module["interfaces"][:]:
 
         if "methods" in interface:
             for method in interface["methods"][:]:
                 if "extendedAttributes" not in method: continue
                 if "notify" not in method["extendedAttributes"]: continue
-                
+
                 newInterfaceName = interface["name"] + "Notify"
                 newInterface     = newInterfaces.get(newInterfaceName)
-                
+
                 if not newInterface:
                     newInterface = {
                         "name": newInterfaceName,
@@ -126,16 +138,16 @@
 def splitInspectorInterfaces(module):
     intfOrig      = module["interfaces"][0]
     newInterfaces = {}
-    
+
     module["interfaces"] = []
 
     for method in intfOrig["methods"]:
         if "domain" not in method["extendedAttributes"]:
             log("Inspector method %s does not have a 'domain' extended attribute" % (method["name"]))
             continue
-            
+
         intfName = method["extendedAttributes"]["domain"]
-        
+
         if "notify" in method["extendedAttributes"]:
             intfName += "Notify"
 
@@ -153,15 +165,15 @@
             }
             newInterfaces[intfName] = intf
             module["interfaces"].append(intf)
-            
+
         intf["methods"].append(method)
-            
+
 #        for parameter in method["parameters"]:
 #            if "out" not in parameter:
 #                log("Inspector method %s has an unexpected non-out parameter %s" % (method["name"], parameter["name"]))
 #            else:
 #                del parameter["out"]
-        
+
 #        intfWebInspector["methods"].append(method)
 
 #--------------------------------------------------------------------
@@ -169,23 +181,23 @@
     interfaces = {}
 
     errors = False
-    
+
     # build table of interface names
     for interface in module["interfaces"]:
         interfaces[interface["name"]] = interface
-        
+
     # check interfaces
     for interface in module["interfaces"]:
-        
+
         if "methods" in interface:
             for method in interface["methods"]:
                 location = "%s.%s" % (interface["name"], method["name"])
                 errors = checkType(location, interfaces, method["returns"]) or errors
-                
+
                 for parameter in method["parameters"]:
                     errors = checkType(location, interfaces, parameter["type"]) or errors
-                
-    
+
+
         if "attributes" in interface:
             for attribute in interface["attributes"]:
                 location = "%s.%s" % (interface["name"], attribute["name"])
@@ -195,14 +207,14 @@
 #--------------------------------------------------------------------
 def checkType(location, interfaces, type):
     typeName = type["name"]
-    
+
     if typeName in BuiltInTypes: return False
     if typeName in interfaces: return False
-    
+
     log("type '%s' is not valid in %s" % (typeName, location))
-    
+
     return True
-    
+
 
 #--------------------------------------------------------------------
 def parseIDL(content):
@@ -211,20 +223,20 @@
 
     match = PatternModule.match(content)
     if not match: error("no module found in input")
-    
+
     moduleName = match.group(1).strip()
     content    = match.group(2)
-    
+
     module = {}
     module["name"] = moduleName
-    
+
     interfaces = []
     module["interfaces"] = interfaces
-    
+
     while True:
         match = PatternInterface.match(content)
         if not match: break
-        
+
         interfaceEAs  = match.group(1)
         interfaceName = match.group(2).strip()
         interfaceBody = match.group(3)
@@ -233,19 +245,19 @@
         interface = {}
         interface["name"] = interfaceName
         parseExtendedAttributes(interface, interfaceEAs)
-        
+
         interfaces.append(interface)
-        
+
         while True:
             match = PatternMethod.match(interfaceBody)
             if match:
                 method = parseMethod(match)
                 if not "methods" in interface: interface["methods"] = []
                 interface["methods"].append(method)
-                
+
                 interfaceBody = match.group(6)
                 continue
-                
+
             match = PatternAttribute.match(interfaceBody)
             if match:
                 attribute = parseAttribute(match)
@@ -255,54 +267,54 @@
                 interfaceBody = match.group(5)
                 continue
 
-            if interfaceBody.strip() != "": 
+            if interfaceBody.strip() != "":
                 error("unexpected input: '%s'" % interfaceBody)
-                
+
             break
-        
+
     if content.strip() != "}": error("unexpected input: '%s'" % content)
-    
+
     return module
 
 #--------------------------------------------------------------------
 def parseExtendedAttributes(object, eaStrings):
     if not eaStrings: return
     if eaStrings == "": return
-    
+
     eaStrings = eaStrings[1:-1]
     eaStrings = eaStrings.split(",")
-    
+
     eas = {}
     for eaString in eaStrings:
         match = PatternExtendedAttribute.match(eaString)
         if not match:
             error("invalid extended attribute: '%s'" % eaString)
-        
+
         if match.group(3):
             eas[match.group(1)] = match.group(3)
         else:
             eas[match.group(1)] = True
-    
+
     if len(eas):
         object["extendedAttributes"] = eas
 
 #--------------------------------------------------------------------
 def parseMethod(match):
     method = {}
-    
+
     eas                  = match.group(1)
     method["returns"]    = getType(match.group(2), match.group(3))
     method["name"]       = match.group(4)
     method["parameters"] = parseMethodParameters(match.group(5))
-    
+
     parseExtendedAttributes(method, eas)
-    
+
     return method
 
 #--------------------------------------------------------------------
 def parseAttribute(match):
     attribute = {}
-    
+
     eas               = match.group(1)
     attribute["type"] = getType(match.group(2), match.group(3))
     attribute["name"] = match.group(4)
@@ -314,43 +326,43 @@
 #--------------------------------------------------------------------
 def parseMethodParameters(parameterString):
     parameters = []
-    
+
     parameterString = parameterString.strip()
     if "" == parameterString: return parameters
-    
+
     parmStrings = parameterString.split(",")
     for parmString in parmStrings:
         parameter = {}
-        
+
         parts = parmString.split()
         if parts[0] in ["in", "out"]:
             parmString = " ".join(parts[1:])
             if parts[0] == "out":
                 parameter["out"] = True
-                
+
         match = PatternParameter.match(parmString)
         if not match:
             error("error parsing parameter in '" + parameterString + "'")
-            
-        
+
+
         parameter["type"] = getType(match.group(1), match.group(2))
-        
+
         if match.group(5):
             parameter["name"] = match.group(5)
         else:
             parameter["name"] = match.group(3)
-        
+
         parameters.append(parameter)
-        
+
     return parameters
 
 #--------------------------------------------------------------------
 def getType(name, rank):
     name = name.strip()
     rank = PatternWhiteSpace.sub("", rank)
-    
+
     origName = name
-    
+
     if name == "long":      name = "int"
     if name == "int":       name = "int"
     if name == "double":    name = "float"
@@ -358,24 +370,24 @@
     if name == "DOMString": name = "string"
     if name == "String":    name = "string"
     if name in AnyTypes:    name = "any"
-    
+
     if name == "Array":
         return {
             "name": "any",
             "rank": 1
         }
-    
+
     result = {}
     result["name"] = name
-    
+
     if name != origName: result["originalName"] = origName
-    
+
     if rank:
-        if (rank == "[]"): 
+        if (rank == "[]"):
             result["rank"] = 1
         else:
             error("currently only one dimensional arrays are supported: %s" % name)
-        
+
     return result
 
 #--------------------------------------------------------------------
@@ -384,7 +396,7 @@
     content = PatternPreprocessor.sub("", content)
     content = PatternNewLine.sub("", content)
     content = PatternComments.sub("", content)
-    
+
     return content
 
 #--------------------------------------------------------------------
diff --git a/weinre.build/vendor.properties b/weinre.build/vendor.properties
index 386e4c8..f54545f 100644
--- a/weinre.build/vendor.properties
+++ b/weinre.build/vendor.properties
@@ -1,8 +1,20 @@
 # ---
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2011 IBM Corporation
+#     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.
 # ---
 
 #-----------------------------------------------------------
diff --git a/weinre.doc/Building.body.html b/weinre.doc/Building.body.html
index 79ab67f..f5dc33b 100644
--- a/weinre.doc/Building.body.html
+++ b/weinre.doc/Building.body.html
@@ -1,8 +1,20 @@
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <p>The source repository for weinre is maintained at
diff --git a/weinre.doc/ChangeLog.body.html b/weinre.doc/ChangeLog.body.html
index 404ad29..9759636 100644
--- a/weinre.doc/ChangeLog.body.html
+++ b/weinre.doc/ChangeLog.body.html
@@ -1,8 +1,20 @@
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2011 IBM Corporation
+ *     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.
 -->
 
 <!-- ======================================================================= -->
diff --git a/weinre.doc/Home.body.html b/weinre.doc/Home.body.html
index f5ef7de..281414a 100644
--- a/weinre.doc/Home.body.html
+++ b/weinre.doc/Home.body.html
@@ -1,9 +1,21 @@
 
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <p><span class="weinre">weinre</span> is <b>WE</b>b <b>IN</b>spector <b>RE</b>mote.
diff --git a/weinre.doc/Installing.body.html b/weinre.doc/Installing.body.html
index b94638a..c64088a 100644
--- a/weinre.doc/Installing.body.html
+++ b/weinre.doc/Installing.body.html
@@ -1,8 +1,20 @@
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <p><span class="weinre">weinre</span> is shipped as two archives
diff --git a/weinre.doc/License.body.html b/weinre.doc/License.body.html
index 975309d..d775ca5 100644
--- a/weinre.doc/License.body.html
+++ b/weinre.doc/License.body.html
@@ -1,8 +1,20 @@
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <p>weinre contains code from the following other projects:
@@ -31,9 +43,9 @@
 </ul>
 
 <p>The source for weinre itself is available under either
-the terms of the modified BSD license
-or
-the MIT License.
-See
-<a href="http://opensource.org/licenses/alphabetical">http://opensource.org/licenses/alphabetical</a>
-for full text.
+the terms of the Apacle License, Version 2.0.  You may obtain a copy of the
+License at
+
+<blockquote>
+    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+</blockquote>
diff --git a/weinre.doc/MultiUser.body.html b/weinre.doc/MultiUser.body.html
index 065d892..177f363 100644
--- a/weinre.doc/MultiUser.body.html
+++ b/weinre.doc/MultiUser.body.html
@@ -1,8 +1,20 @@
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <p><span class="weinre">weinre</span> was originally designed so that each user
diff --git a/weinre.doc/Running.body.html b/weinre.doc/Running.body.html
index 6a63add..652bddd 100644
--- a/weinre.doc/Running.body.html
+++ b/weinre.doc/Running.body.html
@@ -1,8 +1,20 @@
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <p>This page describes how to use <span class="weinre">weinre</span> to debug
diff --git a/weinre.doc/Security.body.html b/weinre.doc/Security.body.html
index 14e1ee3..d8c09e6 100644
--- a/weinre.doc/Security.body.html
+++ b/weinre.doc/Security.body.html
@@ -1,8 +1,20 @@
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <p>About security for <span class="weinre">weinre</span>: <b>there is none</b>.
diff --git a/weinre.doc/TestDrive.body.html b/weinre.doc/TestDrive.body.html
index 76991e8..1bd1c2d 100644
--- a/weinre.doc/TestDrive.body.html
+++ b/weinre.doc/TestDrive.body.html
@@ -1,16 +1,28 @@
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
 -->
 
-<p>This page gives a walk through of using <span class="weinre">weinre</span> to 
+<p>This page gives a walk through of using <span class="weinre">weinre</span> to
 debug a sample page that is provided with <span class="weinre">weinre</span> itself.  Read
 this walk through first, then follow along and run <span class="weinre">weinre</span> yourself
-to make sure it's installed and running correctly.  
+to make sure it's installed and running correctly.
 
-<p>You may also want to check out 
+<p>You may also want to check out
 <a href="http://www.youtube.com/watch?v=gaAI29UkVCc">the movie</a>, which
 shows a walk through with the demo page.
 
@@ -21,7 +33,7 @@
 
 <p>After you're done with the
 walk through, if you want to learn how to debug your own web pages with
-<span class="weinre">weinre</span>, 
+<span class="weinre">weinre</span>,
 head to the
 <a href="Running.html">Running page</a> for more information.
 
@@ -39,26 +51,26 @@
 bind to something other than just localhost.  The default configuration
 is the safe one, and good enough to run this walk through.
 
-<p>To start the server,  
+<p>To start the server,
 <a href="Installing.html">install the <tt>weinre.jar</tt> file</a>,
 then run the following command:
 
 <pre>
 java -jar weinre.jar -httpPort 8081
-</pre> 
+</pre>
 
 <p><img src="images/weinre-con-01-h.jpg">
 
-<p>You should see some output in your console, 
+<p>You should see some output in your console,
 like this:
 
 <p><img src="images/weinre-con-02-h.jpg">
 
-<p>If you see messages about "Address in use", 
+<p>If you see messages about "Address in use",
 that means that some other program is using port 8081, and so you'll need to
 use a different one.
 
-<p>Note that the server is now running.  
+<p>Note that the server is now running.
 When you are ready to stop the server, kill the
 program with Ctrl-C or whatever.
 
@@ -90,7 +102,7 @@
 Note that you probably want to open this page in
 another window (not just another tab, and not
 replacing this page).
-The link should be 
+The link should be
 <tt><a href="http://localhost:8081/client">http://localhost:8081/client</a></tt>.
 
 <p>You should see the following page in your browser:
@@ -103,12 +115,12 @@
 shown, at the
 top of the web page - "Remote", "Elements", and "Console".
 
-<p>The "Remote" panel 
+<p>The "Remote" panel
 provides information about what clients and targets
 are connected to the server, and other goodies.
 
 <p>The "Remote" panel is not included with the desktop browser's
-version of Web Inspector.  But the other two panels, 
+version of Web Inspector.  But the other two panels,
 "Elements" and "Console" are the exact same panels from the
 desktop browser version of Web Inspector.
 
@@ -138,7 +150,7 @@
 <p><img src="images/weinre-cli-03-p.jpg">
 
 <p>You should now see that there's a target connected, as indicated
-by the entry in the Targets section.  That's 
+by the entry in the Targets section.  That's
 your demo page - you know because it shows the URL.
 
 <p>It's also green, meaning that a client is connected to it.  That's you!
@@ -146,7 +158,7 @@
 to a target.
 
 <p>The debug client will always attempt to connect to the most recently
-connected debug target.  But you can also click on a target to 
+connected debug target.  But you can also click on a target to
 explicitly switch to it.
 
 <p>Now what?  Try clicking the Elements tab, as indicated
@@ -164,7 +176,7 @@
 
 <p><img src="images/weinre-cli-04-h.jpg">
 
-<p>The console is now open, as shown below.  
+<p>The console is now open, as shown below.
 
 <p><img src="images/weinre-cli-05-h.jpg">
 
@@ -177,7 +189,7 @@
 document.body.style.background = "green"
 </pre>
 
-<p>Guess what that does? 
+<p>Guess what that does?
 
 <p><img src="images/weinre-cli-06-h.jpg">
 
diff --git a/weinre.doc/UserInterface.body.html b/weinre.doc/UserInterface.body.html
index b5a95cd..3a83479 100644
--- a/weinre.doc/UserInterface.body.html
+++ b/weinre.doc/UserInterface.body.html
@@ -1,8 +1,20 @@
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <p>This page describes the user interface provided by <span class="weinre">weinre</span>.
diff --git a/weinre.doc/boilerplate-header.html.txt b/weinre.doc/boilerplate-header.html.txt
index 73acd31..77ae9ed 100644
--- a/weinre.doc/boilerplate-header.html.txt
+++ b/weinre.doc/boilerplate-header.html.txt
@@ -1,10 +1,22 @@
 <!doctype html>
 
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <html>
diff --git a/weinre.doc/boilerplate-trailer.html.txt b/weinre.doc/boilerplate-trailer.html.txt
index f2244a0..78ba0b4 100644
--- a/weinre.doc/boilerplate-trailer.html.txt
+++ b/weinre.doc/boilerplate-trailer.html.txt
@@ -1,10 +1,22 @@
 
 
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <div class="toc">
diff --git a/weinre.doc/css/main.css b/weinre.doc/css/main.css
index ba071e2..8e4078d 100644
--- a/weinre.doc/css/main.css
+++ b/weinre.doc/css/main.css
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
  */
 
 body {
diff --git a/weinre.doc/scripts/main.js b/weinre.doc/scripts/main.js
index ce6c8f2..68dc5b0 100644
--- a/weinre.doc/scripts/main.js
+++ b/weinre.doc/scripts/main.js
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 //-----------------------------------------------------------------------------
@@ -16,12 +28,12 @@
     for (var i=0; i<elements.length; i++) {
         var element = elements[i]
         if (!hasClass(element, "expand-on-click")) continue
-     
+
         addClass(element, "width-transition")
-        element._original_width_ = element.width 
+        element._original_width_ = element.width
         element._contracted_     = true
         element.width            = element.width / 2
-        
+
         element.addEventListener("click", clickToExpand, false)
     }
 }
@@ -29,20 +41,20 @@
 //-----------------------------------------------------------------------------
 function clickToExpand(event) {
     var element = this
-    
+
     if (element._contracted_) {
         element.width = element._original_width_
     }
     else {
         element.width = element._original_width_ / 2
     }
-    
+
     element._contracted_ = ! element._contracted_
-    
+
 //     if (hasClass(element, "contracted")) {
 //         removeClass(element, "contracted")
 //     }
-//     
+//
 //     else {
 //         addClass(element,    "contracted")
 //     }
@@ -60,7 +72,7 @@
 //-----------------------------------------------------------------------------
 function addClass(element, className) {
     if (hasClass(element, className)) return
-    
+
     element.className += " " + className
 }
 
diff --git a/weinre.server/interfaces/WeinreClientCommands.idl b/weinre.server/interfaces/WeinreClientCommands.idl
index d0f86cb..9c4707e 100644
--- a/weinre.server/interfaces/WeinreClientCommands.idl
+++ b/weinre.server/interfaces/WeinreClientCommands.idl
@@ -1,15 +1,27 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 // messages from the client to the server
 
 module weinre {
     interface WeinreClientCommands {
-    
+
         void registerClient(out string clientId);
 
         void getTargets(out Object[] targets);
@@ -17,9 +29,9 @@
 
         void connectTarget(in string clientId, in string targetId);
         void disconnectTarget(in string clientId);
-        
+
         void getExtensions(out string[] extensions)
-        
+
         void logDebug(   in string message );
         void logInfo(    in string message );
         void logWarning( in string message );
diff --git a/weinre.server/interfaces/WeinreClientEvents.idl b/weinre.server/interfaces/WeinreClientEvents.idl
index 4e9f0d9..612ed27 100644
--- a/weinre.server/interfaces/WeinreClientEvents.idl
+++ b/weinre.server/interfaces/WeinreClientEvents.idl
@@ -1,15 +1,27 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 // messages from the server to the client
 
 module weinre {
     interface WeinreClientEvents {
-    
+
         void clientRegistered(Object client);
         void targetRegistered(Object target);
 
@@ -18,9 +30,9 @@
 
         void connectionCreated(string clientId, string targetId);
         void connectionDestroyed(string clientId, string targetId);
-        
+
         void sendCallback(string callbackId, Object result);
-        
+
         void serverProperties(Object properties);
     };
 }
diff --git a/weinre.server/interfaces/WeinreExtraClientCommands.idl b/weinre.server/interfaces/WeinreExtraClientCommands.idl
index 5d6fe5c..c28b747 100644
--- a/weinre.server/interfaces/WeinreExtraClientCommands.idl
+++ b/weinre.server/interfaces/WeinreExtraClientCommands.idl
@@ -1,15 +1,27 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2011 IBM Corporation
+ * 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.
  */
 
 // extra messages from the client to the target
 
 module weinre {
     interface WeinreExtraClientCommands {
-    
+
         void getDatabases(out Object[] databaseRecords);
 
     };
diff --git a/weinre.server/interfaces/WeinreExtraTargetEvents.idl b/weinre.server/interfaces/WeinreExtraTargetEvents.idl
index 58a6b72..0f2ca54 100644
--- a/weinre.server/interfaces/WeinreExtraTargetEvents.idl
+++ b/weinre.server/interfaces/WeinreExtraTargetEvents.idl
@@ -1,15 +1,27 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2011 IBM Corporation
+ * 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.
  */
 
 // extra messages from the target to the client
 
 module weinre {
     interface WeinreExtraTargetEvents {
-    
+
         void databaseOpened(in Object databaseRecord);
 
     };
diff --git a/weinre.server/interfaces/WeinreTargetCommands.idl b/weinre.server/interfaces/WeinreTargetCommands.idl
index ed3f051..253229c 100644
--- a/weinre.server/interfaces/WeinreTargetCommands.idl
+++ b/weinre.server/interfaces/WeinreTargetCommands.idl
@@ -1,15 +1,27 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 // messages from the target to the server
 
 module weinre {
     interface WeinreTargetCommands {
-    
+
         void registerTarget(int url, out string targetId);
 
         void sendClientCallback(string callbackId, Object args);
diff --git a/weinre.server/interfaces/WeinreTargetEvents.idl b/weinre.server/interfaces/WeinreTargetEvents.idl
index 5326b4b..b9060fb 100644
--- a/weinre.server/interfaces/WeinreTargetEvents.idl
+++ b/weinre.server/interfaces/WeinreTargetEvents.idl
@@ -1,20 +1,32 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 // messages from the server to the target
 
 module weinre {
     interface WeinreTargetEvents {
-    
+
         void connectionCreated(string clientId, string targetId);
         void connectionDestroyed(string clientId, string targetId);
-        
+
         void sendCallback(string callbackId, Object result);
-        
+
     };
 }
 
diff --git a/weinre.server/src/weinre/server/Channel.java b/weinre.server/src/weinre/server/Channel.java
index 0e19b12..6401e42 100644
--- a/weinre.server/src/weinre/server/Channel.java
+++ b/weinre.server/src/weinre/server/Channel.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
  */
 
 package weinre.server;
diff --git a/weinre.server/src/weinre/server/ChannelManager.java b/weinre.server/src/weinre/server/ChannelManager.java
index 77f326a..2926b09 100644
--- a/weinre.server/src/weinre/server/ChannelManager.java
+++ b/weinre.server/src/weinre/server/ChannelManager.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server;
@@ -19,11 +31,11 @@
 
     private Map<String, Channel>              channelMap;
     private List<ChannelManagerEventListener> eventListeners;
-    
+
     //---------------------------------------------------------------
     private ChannelManager() {
         super();
-        
+
         channelMap     = new HashMap<String, Channel>();
         eventListeners = new ArrayList<ChannelManagerEventListener>();
     }
@@ -32,7 +44,7 @@
     public void addEventListener(ChannelManagerEventListener listener) {
         eventListeners.add(listener);
     }
-    
+
     //---------------------------------------------------------------
     public void removeEventListener(ChannelManagerEventListener listener) {
         eventListeners.add(listener);
@@ -44,7 +56,7 @@
             listener.channelRegistered(channel);
         }
     }
-    
+
     //---------------------------------------------------------------
     private void fireDeregisteredEvent(Channel channel) {
         for (ChannelManagerEventListener listener: eventListeners) {
@@ -56,43 +68,43 @@
     public Channel getChannel(String channelName) {
         return channelMap.get(channelName);
     }
-    
+
     //---------------------------------------------------------------
     public Channel getChannel(String channelName, String remoteAddress) {
         Channel channel = getChannel(channelName);
         if (null == channel) return null;
-        
+
         if (!channel.getRemoteAddress().equals(remoteAddress)) return null;
-        
+
         return channel;
     }
-    
+
     //---------------------------------------------------------------
     public List<Channel> getChannels() {
         return new ArrayList<Channel>(channelMap.values());
     }
-    
+
     //---------------------------------------------------------------
     public Channel registerChannel(String pathPrefix, String channelName, String id, String remoteHost, String remoteAddress) {
         if (channelMap.containsKey(channelName)) return null;
-        
+
         Channel channel = new Channel(pathPrefix, channelName, id, remoteHost, remoteAddress);
         channelMap.put(channelName, channel);
-        
+
         fireRegisteredEvent(channel);
-        
+
         return channel;
     }
-    
+
     //---------------------------------------------------------------
     public Channel deregisterChannel(String channelName) {
         Channel channel = getChannel(channelName);
         if (null == channel) return null;
-        
+
         fireDeregisteredEvent(channel);
-        
+
         channelMap.remove(channelName);
-        
+
         return channel;
     }
 
diff --git a/weinre.server/src/weinre/server/ChannelManagerEventListener.java b/weinre.server/src/weinre/server/ChannelManagerEventListener.java
index e97ef7c..f15f2dd 100644
--- a/weinre.server/src/weinre/server/ChannelManagerEventListener.java
+++ b/weinre.server/src/weinre/server/ChannelManagerEventListener.java
@@ -1,18 +1,30 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server;
 
 //-------------------------------------------------------------------
 public interface ChannelManagerEventListener {
-    
+
     //---------------------------------------------------------------
     public void channelRegistered(Channel channel);
-    
+
     //---------------------------------------------------------------
     public void channelDeregistered(Channel channel);
 }
diff --git a/weinre.server/src/weinre/server/Client.java b/weinre.server/src/weinre/server/Client.java
index 4eed575..d2118cc 100644
--- a/weinre.server/src/weinre/server/Client.java
+++ b/weinre.server/src/weinre/server/Client.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server;
@@ -15,7 +27,7 @@
 public class Client extends Connector {
 
     private Target connectedTarget;
-    
+
     //---------------------------------------------------------------
     public Client(Channel channel) {
         super(channel);
@@ -26,18 +38,18 @@
     public boolean isClient() {
         return true;
     }
-    
+
     //---------------------------------------------------------------
     public Target getConnectedTarget() {
         return connectedTarget;
     }
-    
+
     //---------------------------------------------------------------
     protected void _connect(Target target) {
         if (null == target) return;
-        
+
         Lock.lock();
-        
+
         try {
             connectedTarget = target;
         }
@@ -45,13 +57,13 @@
             Lock.unlock();
         }
     }
-    
+
     //---------------------------------------------------------------
     protected void _disconnect(Target target) {
         if (null == target) return;
-        
+
         Lock.lock();
-        
+
         try {
             connectedTarget = null;
         }
@@ -59,22 +71,22 @@
             Lock.unlock();
         }
     }
-    
+
     //---------------------------------------------------------------
     public JSONObject getDescription() {
       JSONObject result = new JSONObject();
-      
+
       try {
           result.put("channel",            getChannel().getName());
           result.put("id",                 getChannel().getId());
           result.put("hostName",           getChannel().getRemoteHost());
           result.put("connectedTargetIds", new JSONArray());
-      } 
+      }
       catch (JSONException e) {
           throw new RuntimeException(e);
       }
 
       return result;
     }
-    
+
 }
diff --git a/weinre.server/src/weinre/server/ConnectionManager.java b/weinre.server/src/weinre/server/ConnectionManager.java
index 7a3ccc1..88994cc 100644
--- a/weinre.server/src/weinre/server/ConnectionManager.java
+++ b/weinre.server/src/weinre/server/ConnectionManager.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server;
@@ -17,15 +29,15 @@
 public class ConnectionManager {
 
     static final public ConnectionManager $ = new ConnectionManager();
-    
+
     private Map<String,Client> clientMap;
     private Map<String,Target> targetMap;
-    private boolean            listening = false; 
+    private boolean            listening = false;
 
     //---------------------------------------------------------------
     private ConnectionManager() {
         super();
-        
+
         clientMap = Collections.synchronizedMap(new HashMap<String,Client>());
         targetMap = Collections.synchronizedMap(new HashMap<String,Target>());
     }
@@ -34,9 +46,9 @@
     public void startChannelListener() {
         if (listening) return;
         listening = true;
-        
+
         ChannelManager.$.addEventListener(new ChannelManagerEventListener() {
-            
+
             @Override
             public void channelRegistered(Channel channel) {
             }
@@ -51,7 +63,7 @@
             }
         });
     }
-    
+
     //---------------------------------------------------------------
     public void addClient(Client client) {
         clientMap.put(client.getName(), client);
@@ -89,26 +101,26 @@
     //---------------------------------------------------------------
     public List<Client> getClients(String id) {
         List<Client> result = new ArrayList<Client>();
-        
+
         for (Client client: clientMap.values()) {
             if (client.getId().equals(id)) {
                 result.add(client);
             }
         }
-        
+
         return result;
     }
 
     //---------------------------------------------------------------
     public List<Target> getTargets(String id) {
         List<Target> result = new ArrayList<Target>();
-        
+
         for (Target target: targetMap.values()) {
             if (target.getId().equals(id)) {
                 result.add(target);
             }
         }
-        
+
         return result;
     }
 
@@ -120,10 +132,10 @@
         if (connectedTarget == target) return;
 
         disconnect(client, connectedTarget);
-        
+
         client._connect(target);
         target._connect(client);
-        
+
         _sendConnectionCreatedEvent(client, target);
     }
 
@@ -141,12 +153,12 @@
     private void _sendConnectionCreatedEvent(Client client, Target target) {
         _sendConnectionEvent(client, target, "connectionCreated");
     }
-    
+
     //---------------------------------------------------------------
     private void _sendConnectionDestroyedEvent(Client client, Target target) {
         _sendConnectionEvent(client, target, "connectionDestroyed");
     }
-    
+
     //---------------------------------------------------------------
     private void _sendConnectionEvent(Client client, Target target, String message) {
         String clientName = client.getChannel().getName();
@@ -155,7 +167,7 @@
         _sendAllClientsEvent("WeinreClientEvents", client.getId(), message, clientName, targetName);
         target.getChannel().sendEvent("WeinreTargetEvents", message, clientName, targetName);
     }
-    
+
     //---------------------------------------------------------------
     private void _sendAllClientsEvent(String intfName, String id, String message, Object... args) {
         for (Client aClient: getClients(id)) {
@@ -166,7 +178,7 @@
     //---------------------------------------------------------------
     protected void closeConnector(Connector connector) {
         if (null == connector) return;
-        
+
         if (connector.isClient()) _closeClient((Client)connector);
         if (connector.isTarget()) _closeTarget((Target)connector);
     }
@@ -179,21 +191,21 @@
         if (null != target) {
             disconnect(client, target);
         }
-        
+
         _removeClient(client);
     }
-    
+
     //---------------------------------------------------------------
     private void _closeTarget(Target target) {
         if (null == target) return;
 
         List<Client> clients = target.getConnectedClients();
-        
+
         for (Client client: clients) {
             disconnect(client, target);
         }
-        
+
         _removeTarget(target);
     }
-    
+
 }
diff --git a/weinre.server/src/weinre/server/Connector.java b/weinre.server/src/weinre/server/Connector.java
index 80c2895..5497895 100644
--- a/weinre.server/src/weinre/server/Connector.java
+++ b/weinre.server/src/weinre/server/Connector.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server;
@@ -18,78 +30,78 @@
 abstract public class Connector {
 
     static final protected Lock Lock = new ReentrantLock();
-    
+
     private Channel channel;
-    
+
     //---------------------------------------------------------------
     public Connector(Channel channel) {
         super();
-        
+
         this.channel = channel;
         channel._setConnector(this);
     }
-    
+
     //---------------------------------------------------------------
     protected void _register() {
         if (isClient()) ConnectionManager.$.addClient((Client) this);
         if (isTarget()) ConnectionManager.$.addTarget((Target) this);
     }
-    
+
     //---------------------------------------------------------------
     public Channel getChannel() {
         return channel;
     }
-    
+
     //---------------------------------------------------------------
     public String getName() {
         return channel.getName();
     }
-    
+
     //---------------------------------------------------------------
     public String getId() {
         return channel.getId();
     }
-    
+
     //---------------------------------------------------------------
     public List<Connector> getConnections() {
         List<Connector> result = new ArrayList<Connector>();
-        
+
         if (isClient()) {
             Connector target = ((Client) this).getConnectedTarget();
             if (null != target) {
                 result.add(target);
             }
         }
-        
+
         else if (isTarget()) {
             result.addAll(((Target) this).getConnectedClients());
         }
-        
+
         else {
             throw new RuntimeException("connector which isn't a client or target");
         }
-        
+
         return result;
     }
-    
+
     //---------------------------------------------------------------
     abstract public JSONObject getDescription();
-    
+
     //---------------------------------------------------------------
     public boolean isClosed() {
         return channel.isClosed();
     }
-    
+
     //---------------------------------------------------------------
     public boolean isClient() {
         return false;
     }
-    
+
     //---------------------------------------------------------------
     public boolean isTarget() {
         return false;
     }
-    
+
     //---------------------------------------------------------------
     public String toString() {
         return getClass().getName() + "{" + channel + "}";
diff --git a/weinre.server/src/weinre/server/ConsoleOutputStream.java b/weinre.server/src/weinre/server/ConsoleOutputStream.java
index dc62c2d..307addc 100644
--- a/weinre.server/src/weinre/server/ConsoleOutputStream.java
+++ b/weinre.server/src/weinre/server/ConsoleOutputStream.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server;
@@ -23,7 +35,7 @@
     static public PrintStream newPrintStream(Main main, PrintStream originalStream, boolean stdout) {
         return new PrintStream(new ConsoleOutputStream(main, originalStream, stdout));
     }
-    
+
     //---------------------------------------------------------------
     public ConsoleOutputStream(Main main, PrintStream originalStream, boolean stdout) {
         this.main           = main;
@@ -31,17 +43,17 @@
         this.stdout         = stdout;
         this.stringBuffer   = new StringBuffer();
     }
-    
+
     //---------------------------------------------------------------
     @Override
     public void write(int c) throws IOException {
         if (c == 0x0D) return;
-        
+
         if (c != 0x0A) {
             stringBuffer.append(Character.toChars(c));
             return;
         }
-        
+
         String line = stringBuffer.toString();
         stringBuffer = new StringBuffer();
         _writeLine(line);
@@ -50,7 +62,7 @@
     //---------------------------------------------------------------
     private void _writeLine(String line) {
         originalStream.println(line);
-        
+
         main.addServerConsoleMessage(line, stdout);
     }
 
diff --git a/weinre.server/src/weinre/server/ExtensionManager.java b/weinre.server/src/weinre/server/ExtensionManager.java
index 3977e86..6831904 100644
--- a/weinre.server/src/weinre/server/ExtensionManager.java
+++ b/weinre.server/src/weinre/server/ExtensionManager.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server;
@@ -17,50 +29,50 @@
 
 //-------------------------------------------------------------------
 public class ExtensionManager {
-    static private File     weinreHomeDir = null;     
-    static private File     weinreExtDir  = null;    
+    static private File     weinreHomeDir = null;
+    static private File     weinreExtDir  = null;
     static private long     weinreExtDate = 0L;
     static private String[] extensions    = null;
-    
+
     static private String[] EMPTY_STRING_ARRAY = {};
 
     //---------------------------------------------------------------
     static {
         initExtensions();
     }
-    
+
     //---------------------------------------------------------------
     static public String[] getExtensions() {
         if (null == weinreExtDir) return extensions;
-        
+
         if (weinreExtDate != weinreExtDir.lastModified()) {
             initExtensions();
         }
-        
+
         return extensions;
     }
-    
+
     //---------------------------------------------------------------
     // path: /client/extensions/weinre-ext-sample/extension.html
     static public Resource getResource(String path) throws MalformedURLException {
         if (null == weinreExtDir) return null;
-        
+
         File resourceFile = new File(weinreExtDir, path.substring(18));
         if (!resourceFile.exists()) return null;
-        
+
         try {
             return Resource.newResource(resourceFile.toURI().toURL().toExternalForm(), false);
-        } 
+        }
         catch (IOException e) {
             throw new MalformedURLException();
         }
     }
-    
+
     //---------------------------------------------------------------
     static private void initExtensions() {
-        
+
         extensions = EMPTY_STRING_ARRAY;
-            
+
         weinreHomeDir = new File(System.getProperty("user.home"), ".weinre");
         if (!weinreHomeDir.isDirectory()) {
             Main.info("extensions not enabled: ~/.weinre is not a directory");
@@ -73,23 +85,23 @@
             Main.info("extensions not enabled: ~/.weinre/extensions is not a directory");
             return;
         }
-        
+
         List<String> extensionList = new ArrayList<String>();
-        
+
         String[] entries = weinreExtDir.list();
         for (String entry: entries) {
             if (entry.startsWith(".")) continue;
-            
+
             File extDir = new File(weinreExtDir, entry);
             if (!extDir.isDirectory()) continue;
-            
+
             File extensionHtml = new File(extDir, "extension.html");
             if (!extensionHtml.isFile()) continue;
-            
+
             extensionList.add(entry);
         }
-        
+
         extensions = extensionList.toArray(EMPTY_STRING_ARRAY);
     }
-    
+
 }
diff --git a/weinre.server/src/weinre/server/Main.java b/weinre.server/src/weinre/server/Main.java
index 4968fee..c762142 100644
--- a/weinre.server/src/weinre/server/Main.java
+++ b/weinre.server/src/weinre/server/Main.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server;
@@ -19,10 +31,10 @@
 
 //-------------------------------------------------------------------
 public class Main {
-    
+
     private static ServerSettings  Settings;
     private static Logger          Logger;
-    
+
     public  Server       server;
     private PrintStream  consoleStdout;
     private PrintStream  consoleStderr;
@@ -30,7 +42,7 @@
     //---------------------------------------------------------------
     static public void main(String[] args) throws Throwable {
         Main main = new Main(args);
-        
+
         main.run();
     }
 
@@ -53,43 +65,43 @@
     //---------------------------------------------------------------
     public Main(String[] args) {
         super();
-        
+
         Settings = ServerSettings.getOptions(args);
         if (null == Settings) System.exit(0);
-        
+
         if (null != Settings.getMessageLog()) {
             Settings.getMessageLog().println("[");
         }
-        
+
         Runtime.getRuntime().addShutdownHook(onShutdownThread());
-        
+
         consoleStdout = ConsoleOutputStream.newPrintStream(this, System.out, true);
         consoleStderr = ConsoleOutputStream.newPrintStream(this, System.err, false);
 
         System.setOut(consoleStdout);
         System.setErr(consoleStderr);
     }
-    
+
     //---------------------------------------------------------------
     public void run() throws Throwable, Exception {
         httpServerStart();
         httpServerWaitTillDone();
         exit();
     }
-    
+
     //---------------------------------------------------------------
     private Thread onShutdownThread() {
         return new Thread(new Runnable() {
             public void run() {
                 PrintWriter messageLog = Settings.getMessageLog();
                 if (null == messageLog) return;
-                
+
                 messageLog.println("null ]");
                 messageLog.close();
             }
         });
     }
-    
+
     //---------------------------------------------------------------
     public int exit() {
         if (null != server) {
@@ -107,8 +119,8 @@
                 warn("exception stopping the server: " + e);
                 e.printStackTrace();
             }
-        } 
-        
+        }
+
         System.exit(0);
         return 0;
     }
@@ -117,7 +129,7 @@
     public void httpServerStart() {
         // get the default logger - this should be the first thing to touch the log
         Logger defaultLog = Log.getLog();
-        
+
         if (defaultLog instanceof StdErrLog) {
             ((StdErrLog) defaultLog).setHideStacks(true);
         }
@@ -125,7 +137,7 @@
         // create a special logger for weinre messages
         Logger = org.eclipse.jetty.util.log.Log.getLogger("weinre");
         Logger.setDebugEnabled(Settings.getVerbose());
-        
+
         server = null;
         try {
             server = new HttpServer(this, Settings).run();
@@ -133,7 +145,7 @@
         catch (Throwable e) {
             severeError("exception launching server: " + e);
         }
-        
+
         ConnectionManager.$.startChannelListener();
         WatchDog.start();
         MessageHandler.start();
@@ -148,20 +160,20 @@
             severeError("exception waiting for server to stop: " + e);
         }
     }
-    
+
     //---------------------------------------------------------------
     public void serverStarted() {
     }
-    
+
     //---------------------------------------------------------------
     public void addServerConsoleMessage(String line, boolean stdout) {
     }
-    
+
     //---------------------------------------------------------------
     public int severeError(String message) {
         Logger.warn(message);
         Logger.warn("exiting...");
         return exit();
     }
-    
+
 }
diff --git a/weinre.server/src/weinre/server/MessageHandler.java b/weinre.server/src/weinre/server/MessageHandler.java
index bbddc9f..da878ba 100644
--- a/weinre.server/src/weinre/server/MessageHandler.java
+++ b/weinre.server/src/weinre/server/MessageHandler.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server;
@@ -24,40 +36,40 @@
     //---------------------------------------------------------------
     static public void start() {
         final MessageHandler messageHandler = new MessageHandler();
-        
+
         Runnable runnable = new Runnable() {
             public void run() {
                 while (true) {
-                    try { 
+                    try {
                         messageHandler.handleMessages();
-                        Thread.sleep(250); 
-                    } 
+                        Thread.sleep(250);
+                    }
                     catch(InterruptedException e) {
                         throw new RuntimeException(e);
                     }
                 }
             }
         };
-        
+
         Thread thread = new Thread(runnable, messageHandler.getClass().toString());
         thread.start();
     }
-    
+
     //---------------------------------------------------------------
     private MessageHandler() {
         messageLog = Main.getSettings().getMessageLog();
     }
-    
+
     //---------------------------------------------------------------
     private void handleMessages() throws InterruptedException {
         List<Channel> channels = ChannelManager.$.getChannels();
-        
+
         for (Channel channel: channels) {
             List<String> requestss = channel.getRequests(0);
-            
+
             for (String requests: requestss) {
                 JSONArray acc;
-                
+
                 try {
                     acc = new JSONArray(requests);
                 }
@@ -65,7 +77,7 @@
                     Main.warn("error parsing requests: " + e + ": '" + requests + "'");
                     continue;
                 }
-                
+
                 int size = acc.length();
                 for (int i=0; i<size; i++) {
                     JSONObject accRequest;
@@ -74,18 +86,18 @@
                         request = acc.getString(i);
                         accRequest = new JSONObject(request);
                         accRequest.put("_from", channel.getName() + "#" + channel.getId());
-                        
+
                         if (null != messageLog) {
                             messageLog.print(accRequest.toString(true));
                             messageLog.println(",");
                         }
-                        
+
                     }
                     catch (JSONException e) {
                         Main.warn("error parsing request: " + e + ": '" + request + "'");
                         continue;
                     }
-                        
+
                     String intfName;
                     String methodName;
                     JSONArray args;
@@ -96,22 +108,22 @@
                     } catch (JSONException e) {
                         throw new RuntimeException(e);
                     }
-                    
+
                     if (null == intfName) {
                         Main.warn("no interface specified in request: " + request);
                         continue;
                     }
-                    
+
                     if (null == methodName) {
                         Main.warn("no methodName specified in request: " + request);
                         continue;
                     }
-                    
+
                     if (null == args) {
                         Main.warn("no args specified in request: " + request);
                         continue;
                     }
-       
+
                     serviceMethodInvoker(channel, intfName, methodName, args);
                 }
             }
@@ -129,7 +141,7 @@
             String methodSignatureParms = intfName + "." + methodName + "(" + argsJSON.toString() + ")";
             Main.debug(channel.getName() + ": recv " + methodSignatureParms);
         }
-        
+
         try {
             service = channel.getService(intfName);
         }
@@ -137,35 +149,35 @@
             Main.warn("unable to get service object for: " + methodSignature + "; " + e);
             return;
         }
-        
+
         if (null == service) {
             redirectToConnections(channel, intfName, methodName, argsJSON);
             return;
         }
-        
+
         Class serviceClass = service.getClass();
-        
+
         List<Object> args = new ArrayList<Object>(argsJSON);
-        
+
         for (Method method: serviceClass.getMethods()) {
             if (!method.getName().equals(methodName)) continue;
-            
+
             if (method.getParameterTypes().length != args.size() + 1) {
                 Main.warn("invalid number of parameters specified for : " + methodSignature);
                 return;
             }
-            
+
             args.add(0, channel);
-            
+
             try {
                 method.invoke(service, args.toArray());
-            } 
+            }
             catch (IllegalArgumentException e) {
                 Main.warn("illegal argument exception invoking : " + methodSignature + "; " + e);
-            } 
+            }
             catch (IllegalAccessException e) {
                 Main.warn("illegal access exception invoking : " + methodSignature + "; " + e);
-            } 
+            }
             catch (InvocationTargetException e) {
                 Throwable te = e.getTargetException();
                 Main.warn("invocation target exception invoking : " + methodSignature + "; " + te);
@@ -174,7 +186,7 @@
             catch (RuntimeException e) {
                 Main.warn("invocation runtime exception invoking : " + methodSignature + "; " + e);
             }
-            
+
             return;
         }
 
@@ -185,13 +197,13 @@
     private void redirectToConnections(Channel channel, String interfaceName, String methodName, JSONArray args) {
         Connector connector = channel.getConnector();
         if (null == connector) return;
-        
+
         List<Connector> connections = connector.getConnections();
-        
+
         for (Connector connection: connections) {
             connection.getChannel().sendEvent(interfaceName, methodName, args.toArray());
-        } 
+        }
     }
 
-    
+
 }
diff --git a/weinre.server/src/weinre/server/MessageQueue.java b/weinre.server/src/weinre/server/MessageQueue.java
index 09937ea..3c464eb 100644
--- a/weinre.server/src/weinre/server/MessageQueue.java
+++ b/weinre.server/src/weinre/server/MessageQueue.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server;
@@ -15,10 +27,10 @@
 
 /**
  * A type of blocking queue.
- * 
+ *
  * - can be shutdown; subsequent add() or getAll() calls throw ISE
  * - getAll() takes all items off the queue
- * - if there are simultaneous getAll() calls, queued items may be split between them 
+ * - if there are simultaneous getAll() calls, queued items may be split between them
  * - current use case calls for one reader, so previous item not relevant
  */
 public class MessageQueue<E> {
@@ -26,26 +38,26 @@
     private BlockingQueue<E> queue;
     private boolean          closed;
     private Object           closeLock;
-    
+
     //---------------------------------------------------------------
     public MessageQueue() {
         super();
-        
+
         queue     = new LinkedBlockingQueue<E>();
         closed    = false;
         closeLock = new Object();
     }
-    
+
     //---------------------------------------------------------------
     public void shutdown() {
         synchronized(closeLock) {
             if (closed) return;
-            
+
             closed = true;
             queue.clear();
         }
     }
-    
+
     //---------------------------------------------------------------
     public void add(E item) {
         synchronized(closeLock) {
@@ -54,7 +66,7 @@
 
         queue.add(item);
     }
-    
+
     //---------------------------------------------------------------
     public List<E> getAll(int timeout, TimeUnit timeUnit) throws InterruptedException {
         synchronized(closeLock) {
@@ -63,10 +75,10 @@
 
         // create our result list
         List<E> result = new LinkedList<E>();
-        
+
         // wait for the first item
         E item = queue.poll(timeout, timeUnit);
-        
+
         // nothing there?  return empty list
         if (null == item) return result;
 
@@ -78,11 +90,11 @@
         while ((item = queue.poll()) != null) {
             result.add(item);
         }
-        
+
         // return list
         return result;
     }
-    
+
     //---------------------------------------------------------------
     public String toString()  {
         return getClass().getName() + "{" + queue.size() + "}";
diff --git a/weinre.server/src/weinre/server/ServerSettings.java b/weinre.server/src/weinre/server/ServerSettings.java
index a2c73c7..4a43094 100644
--- a/weinre.server/src/weinre/server/ServerSettings.java
+++ b/weinre.server/src/weinre/server/ServerSettings.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server;
@@ -33,7 +45,7 @@
 public class ServerSettings {
 
     final static private String BoundHostAllConstant = "-all-";
-    
+
     private int         httpPort           = 8080;
     private String      boundHost          = "localhost";
 //  private boolean     useProxy           = false;
@@ -43,7 +55,7 @@
     private int         deathTimeoutSeconds;
     private Properties  fileProperties;
     private PrintWriter messageLog;
-    
+
     //---------------------------------------------------------------
     static public ServerSettings getOptions(String[] commandLine) {
         ServerSettings settings = new ServerSettings();
@@ -53,14 +65,14 @@
     //---------------------------------------------------------------
     private ServerSettings() {
         super();
-        
+
         fileProperties = fromPropertiesFile();
     }
 
     //---------------------------------------------------------------
     private Options getOptions() {
         Options options = new Options();
-       
+
         options.addOption("?",            false, "display help");
         options.addOption("h", "help",    false, "display help");
         options.addOption("httpPort",     true,  "tcp/ip port to use for the http server");
@@ -71,7 +83,7 @@
         options.addOption("readTimeout",  true,  "seconds before timing out HTTP GETs");
         options.addOption("deathTimeout", true,  "seconds before considering connector dead");
         options.addOption("messageLog",   true,  "file to log messages to");
-       
+
         return options;
     }
 
@@ -87,20 +99,20 @@
         result.put("reuseAddr",    this.reuseAddr + "");
         result.put("readTimeout",  this.readTimeoutSeconds + "");
         result.put("deathTimeout", this.deathTimeoutSeconds + "");
-        
+
         return result;
     }
 
     //---------------------------------------------------------------
     private Properties fromPropertiesFile() {
         Properties result = Utility.readPropertiesFile("server.properties");
-        
+
         // ya, Properties doesn't trim space off values
         for (String key: result.stringPropertyNames()) {
             String val = result.getProperty(key);
             result.setProperty(key, val.trim());
         }
-        
+
         return result;
     }
 
@@ -112,7 +124,7 @@
         CommandLine       commandLine;
         try {
             commandLine = parser.parse(options, commandLineArgs);
-        } 
+        }
         catch (ParseException e) {
             error(e.getMessage());
             return null;
@@ -145,14 +157,14 @@
     //---------------------------------------------------------------
     private int getIntFromOption(CommandLine commandLine, String name, int defaultValue, int min, int max) {
         int result = defaultValue;
-        
+
         String stringValue = commandLine.getOptionValue(name);
         if (null == stringValue) {
             stringValue = fileProperties.getProperty(name);
         }
 
         if (null == stringValue) return defaultValue;
-            
+
         try {
             result = Integer.parseInt(stringValue);
         }
@@ -160,14 +172,14 @@
             error(name + " parameter must be numeric");
             return result;
         }
-        
+
         if ((result < min) || (result > 0x00FFFF)) {
             error(name + " parameter must be between " + min + " and " + max);
         }
 
         return result;
     }
-    
+
     //---------------------------------------------------------------
     private String getStringFromOption(CommandLine commandLine, String name, String defaultValue) {
         String stringValue = commandLine.getOptionValue(name);
@@ -176,21 +188,21 @@
         }
 
         if (null == stringValue) return defaultValue;
-        
+
         return stringValue;
     }
-    
+
     //---------------------------------------------------------------
     private boolean getBooleanFromOption(CommandLine commandLine, String name, boolean defaultValue) {
         boolean result = defaultValue;
-        
+
         String stringValue = commandLine.getOptionValue(name);
         if (null == stringValue) {
             stringValue = fileProperties.getProperty(name);
         }
 
         if (null == stringValue) return defaultValue;
-            
+
         result = Boolean.parseBoolean(stringValue);
 
         return result;
@@ -198,20 +210,20 @@
 
     //---------------------------------------------------------------
     private PrintWriter getPrintWriterFromOption(CommandLine commandLine, String name) {
-        
+
         String fileName = commandLine.getOptionValue(name);
         if (null == fileName) {
             fileName = fileProperties.getProperty(name);
         }
 
         if (null == fileName) return null;
-        
+
         File file = new File(fileName);
-        
+
         try {
             FileWriter fileWriter = new FileWriter(file);
             return new PrintWriter(fileWriter);
-        } 
+        }
         catch (IOException e) {
             error(name + " parameter file name '" + fileName + "' cannot be opened for writing.");
             return null;
@@ -222,28 +234,28 @@
     private void error(String message) {
         System.out.println("error with command-line option: " + message);
     }
-    
+
     //---------------------------------------------------------------
     private void printHelp(Options options) {
         new HelpFormatter().printHelp("java -jar weinre.jar [options]", options);
     }
-    
+
     //---------------------------------------------------------------
     public int getHttpPort() {
         return httpPort;
     }
-    
+
     //---------------------------------------------------------------
     public String getBoundHost() {
         return boundHost;
     }
-    
+
     //---------------------------------------------------------------
     public String[] getBoundHosts() {
         if (getBoundHostValue() != null) {
             return new String[] { getBoundHost() };
         }
-        
+
         ArrayList<String> hosts = new ArrayList<String>();
         List<NetworkInterface> networkInterfaces;
         try {
@@ -252,45 +264,45 @@
         catch (SocketException e) {
             return new String[]{"localhost"};
         }
-    
+
         for (NetworkInterface networkInterface: networkInterfaces) {
             List<InetAddress> inetAddresses = Collections.list(networkInterface.getInetAddresses());
-            
+
             for (InetAddress inetAddress: inetAddresses) {
                 hosts.add(inetAddress.getHostName());
             }
         }
-        
+
         return hosts.toArray(new String[]{});
     }
-    
+
     //---------------------------------------------------------------
     public String getBoundHostValue() {
         if (BoundHostAllConstant.equals(boundHost)) return null;
-        
+
         return boundHost;
     }
-    
+
     //---------------------------------------------------------------
     public boolean getVerbose() {
         return verbose;
     }
-    
+
     //---------------------------------------------------------------
     public int getReadTimeoutSeconds() {
         return readTimeoutSeconds;
     }
-    
+
     //---------------------------------------------------------------
     public int getDeathTimeoutSeconds() {
         return deathTimeoutSeconds;
     }
-    
+
     //---------------------------------------------------------------
     public boolean useProxy() {
         return false; // useProxy;
     }
-    
+
     //---------------------------------------------------------------
     public boolean reuseAddr() {
         return reuseAddr;
@@ -307,12 +319,12 @@
         if (null == hostName) return "localhost";
         return hostName;
     }
-        
+
     //---------------------------------------------------------------
     @SuppressWarnings("unused")
     private String getSuperNiceHostName() {
         String hostName = getBoundHost();
-        
+
         // get the host address used
         InetAddress inetAddress;
         try {
diff --git a/weinre.server/src/weinre/server/Target.java b/weinre.server/src/weinre/server/Target.java
index ec6a986..8bb3113 100644
--- a/weinre.server/src/weinre/server/Target.java
+++ b/weinre.server/src/weinre/server/Target.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server;
@@ -20,31 +32,31 @@
 
     private List<Client> connectedClients;
     private String       url;
-    
+
     //---------------------------------------------------------------
     public Target(Channel channel, String url) {
         super(channel);
-        
+
         connectedClients = new ArrayList<Client>();
         this.url = url;
         _register();
 
     }
-    
+
     //---------------------------------------------------------------
     public String getURL() {
         return this.url;
     }
-    
+
     //---------------------------------------------------------------
     public boolean isTarget() {
         return true;
     }
-    
+
     //---------------------------------------------------------------
     public List<Client> getConnectedClients() {
         List<Client> result = new LinkedList<Client>();
-        
+
         Lock.lock();
         try {
             result.addAll(connectedClients);
@@ -52,32 +64,32 @@
         finally {
             Lock.unlock();
         }
-        
+
         return result;
     }
-    
+
     //---------------------------------------------------------------
     protected void _connect(Client client) {
         if (null == client) return;
-        
+
         Lock.lock();
-        
+
         try {
             if (connectedClients.contains(client)) return;
-        
+
             connectedClients.add(client);
         }
         finally {
             Lock.unlock();
         }
     }
-    
+
     //---------------------------------------------------------------
     protected void _disconnect(Client client) {
         if (null == client) return;
-        
+
         Lock.lock();
-        
+
         try {
             if (!connectedClients.contains(client)) return;
 
@@ -91,7 +103,7 @@
     //---------------------------------------------------------------
     public JSONObject getDescription() {
         JSONObject result = new JSONObject();
-        
+
         try {
             result.put("channel",            getChannel().getName());
             result.put("id",                 getChannel().getId());
@@ -101,8 +113,8 @@
         } catch (JSONException e) {
             throw new RuntimeException(e);
         }
-        
+
         return result;
     }
-    
+
 }
diff --git a/weinre.server/src/weinre/server/Utility.java b/weinre.server/src/weinre/server/Utility.java
index 260cc2b..cc1dca4 100644
--- a/weinre.server/src/weinre/server/Utility.java
+++ b/weinre.server/src/weinre/server/Utility.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server;
@@ -16,7 +28,7 @@
 
 //-------------------------------------------------------------------
 public class Utility {
-    
+
     static private int SequenceNumber = 1 + new SecureRandom().nextInt(Integer.MAX_VALUE - 1);
 
     //---------------------------------------------------------------
@@ -25,16 +37,16 @@
     //---------------------------------------------------------------
     static public synchronized int getNextSequenceNumber() {
         int result = SequenceNumber;
-        
+
         SequenceNumber = (result == Integer.MAX_VALUE) ? 1 : result + 1;
-        
+
         return result;
     }
-    
+
     //---------------------------------------------------------------
     static public String reverse(String string) {
         char[] responseChars = string.toCharArray();
-        
+
         for (int i=0; i<responseChars.length/2; i++) {
             char tmp                                = responseChars[responseChars.length-i-1];
             responseChars[responseChars.length-i-1] = responseChars[i];
@@ -42,32 +54,32 @@
         }
         return String.valueOf(responseChars);
     }
-    
+
     //---------------------------------------------------------------
     static public byte[] reverse(byte[] data, int offset, int length) {
         byte[] response = new byte[length];
-        
+
         for (int i=0; i<length; i++) {
             response[i] = data[offset + length - i - 1];
         }
 
         return response;
     }
-    
+
     //---------------------------------------------------------------
     static public Properties readPropertiesFile(String fileName) {
         Properties result = new Properties();
-        
+
         String userHome = System.getProperty("user.home");
         if (null == userHome) {
             Main.warn("System property user.home not set!");
             return result;
         }
-        
+
         File file = new File(new File(userHome, ".weinre"), fileName);
-        
+
         if (!file.exists()) return result;
-        
+
         FileReader fr = null;
         try {
             fr = new FileReader(file);
@@ -79,13 +91,13 @@
         finally {
             try { if (fr != null) fr.close(); } catch (Exception e) {}
         }
-        
+
         // ya, Properties doesn't trim space off values
         for (String key: result.stringPropertyNames()) {
             String val = result.getProperty(key);
             result.setProperty(key, val.trim());
         }
-        
+
         return result;
     }
 
@@ -96,7 +108,7 @@
             Main.warn("System property user.home not set!");
             return;
         }
-        
+
         File file = new File(userHome, ".weinre");
         if (!file.exists()) {
             if (!file.mkdir()) {
@@ -104,12 +116,12 @@
                 return;
             }
         }
-        
+
         if (!file.isDirectory()) {
             Main.warn("can't write ~/.weinre/" + fileName + " since ~/.weinre is not a directory");
             return;
         }
-        
+
         file = new File(file, fileName);
         FileWriter fw = null;
         try {
diff --git a/weinre.server/src/weinre/server/WatchDog.java b/weinre.server/src/weinre/server/WatchDog.java
index 9aa6553..327e287 100644
--- a/weinre.server/src/weinre/server/WatchDog.java
+++ b/weinre.server/src/weinre/server/WatchDog.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server;
@@ -13,31 +25,31 @@
 public class WatchDog {
 
     public static long ChannelLivelinessTimeout = 5000;
-    
+
     //---------------------------------------------------------------
     static public void start() {
 
         final WatchDog watchDog = new WatchDog();
-        
+
         Runnable runnable = new Runnable() {
-            public void run() { watchDog.run(); } 
+            public void run() { watchDog.run(); }
         };
-        
+
         Thread thread = new Thread(runnable, watchDog.getClass().getName());
-        
+
         thread.start();
     }
-    
+
     //---------------------------------------------------------------
     private WatchDog() {
         super();
     }
-    
+
     //---------------------------------------------------------------
     private void run() {
         while(true) {
             sleep();
-            
+
             checkForDeadChannels();
         }
     }
@@ -45,24 +57,24 @@
     //---------------------------------------------------------------
     private void checkForDeadChannels() {
         List<Channel> channels = ChannelManager.$.getChannels();
-        
+
         int deathTimeout = Main.getSettings().getDeathTimeoutSeconds() * 1000;
-        
+
         long currentTime = System.currentTimeMillis();
         for (Channel channel: channels) {
             long lastRead = channel.getLastRead();
-            
+
             if (currentTime - lastRead > deathTimeout) {
                 channel.close();
             }
         }
     }
-    
+
     //---------------------------------------------------------------
     private void sleep() {
         try {
             Thread.sleep(1000);
-        } 
+        }
         catch (InterruptedException e) {
             throw new RuntimeException(e);
         }
diff --git a/weinre.server/src/weinre/server/http/ClassPathResourceHandler.java b/weinre.server/src/weinre/server/http/ClassPathResourceHandler.java
index f6eccda..fc0e88f 100644
--- a/weinre.server/src/weinre/server/http/ClassPathResourceHandler.java
+++ b/weinre.server/src/weinre/server/http/ClassPathResourceHandler.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server.http;
@@ -24,7 +36,7 @@
     //---------------------------------------------------------------
     public ClassPathResourceHandler(String pathPrefix) {
         super();
-        
+
         this.pathPrefix = pathPrefix;
     }
 
@@ -38,17 +50,17 @@
         if (path.startsWith("/client/extensions/")) {
             return ExtensionManager.getResource(path);
         }
-        
+
         path = pathPrefix + path;
         URL url = getClass().getClassLoader().getResource(path);
         if (url != null)
             try {
                 return Resource.newResource(url);
-            } 
+            }
             catch (IOException e) {
                 throw new MalformedURLException();
             }
-        
+
         return null;
     }
 
diff --git a/weinre.server/src/weinre/server/http/DebugHandler.java b/weinre.server/src/weinre/server/http/DebugHandler.java
index 13e3f77..8121f03 100644
--- a/weinre.server/src/weinre/server/http/DebugHandler.java
+++ b/weinre.server/src/weinre/server/http/DebugHandler.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server.http;
@@ -20,7 +32,7 @@
 import org.eclipse.jetty.server.handler.HandlerWrapper;
 
 
-/** 
+/**
 * Debug Handler.
 * A lightweight debug handler that can be used in production code.
 * Details of the request and response are written to an output stream
@@ -37,9 +49,9 @@
         catch(IOException e) {
           throw new RuntimeException(e);
         }
-    
+
         Response response = request.getResponse();
-        
+
         dump(System.out, target, request, response);
     }
 
@@ -47,15 +59,15 @@
     private void dump(PrintStream oStream, String target, Request request, Response response) {
         oStream.println("----------------------------------------------------------");
         oStream.println("target: " + target);
-        
+
         oStream.println("request:");
         oStream.println("   headers:");
         dumpHeaders(oStream, request);
-        
+
         oStream.println("response:");
         oStream.println("   status: " + response.getStatus());
     }
-    
+
     //---------------------------------------------------------------
     @SuppressWarnings("rawtypes")
     private void dumpHeaders(PrintStream oStream, Request request) {
diff --git a/weinre.server/src/weinre/server/http/FilteredRequestLogHandler.java b/weinre.server/src/weinre/server/http/FilteredRequestLogHandler.java
index 3a4fad1..1a88e88 100644
--- a/weinre.server/src/weinre/server/http/FilteredRequestLogHandler.java
+++ b/weinre.server/src/weinre/server/http/FilteredRequestLogHandler.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server.http;
@@ -23,7 +35,7 @@
     @Override
     public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
         int status = baseRequest.getResponse().getStatus();
-        
+
         if (status == 200) return;
         if (status == 304) return;
 
diff --git a/weinre.server/src/weinre/server/http/HttpServer.java b/weinre.server/src/weinre/server/http/HttpServer.java
index bfc07f4..e9a5f7c 100644
--- a/weinre.server/src/weinre/server/http/HttpServer.java
+++ b/weinre.server/src/weinre/server/http/HttpServer.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server.http;
@@ -26,22 +38,22 @@
 
     private Main           main;
     private ServerSettings settings;
-    
+
     //---------------------------------------------------------------
     public HttpServer(Main main, ServerSettings settings) {
         super();
-        
+
         this.main     = main;
         this.settings = settings;
     }
-    
+
     //---------------------------------------------------------------
     public Server run() throws Exception {
         String hostName     = settings.getBoundHostValue();
         String niceHostName = settings.getNiceHostName();
-        
+
         SelectChannelConnector connector = new SelectChannelConnector();
-        
+
         connector.setHost(hostName);
         connector.setPort(settings.getHttpPort());
         connector.setReuseAddress(settings.reuseAddr());
@@ -59,7 +71,7 @@
 
         // set up the main handlers
         HandlerList handlers = new HandlerList();
-        
+
         // debug handler
 //        DebugHandler debugHandler = new DebugHandler();
 //        handlers.addHandler(debugHandler);
@@ -69,41 +81,41 @@
         // client socket handler
         httpSocketHandler = new HttpSocketHandler("/ws/client");
         handlers.addHandler(httpSocketHandler);
-        
+
         // target socket handler
         httpSocketHandler = new HttpSocketHandler("/ws/target");
         handlers.addHandler(httpSocketHandler);
 
 //        runChannelTester();
-        
+
         // handler for /web (static files in jar)
         ClassPathResourceHandler handlerStaticFiles = new ClassPathResourceHandler("web");
         handlers.addHandler(handlerStaticFiles);
-        
+
         // outer collection of handlers for management
         HandlerCollection handlerOuter = new HandlerCollection();
-        
+
         // add the main handlers
         handlerOuter.addHandler(handlers);
 
         // add a request logger
         RequestLogHandler requestLogHandler = new FilteredRequestLogHandler();
-        
+
         NCSARequestLog requestLog = new NCSARequestLog();
         requestLog.setRetainDays(90);
         requestLog.setAppend(true);
         requestLog.setExtended(false);
         requestLog.setLogTimeZone("GMT");
         requestLogHandler.setRequestLog(requestLog);
-        
+
         handlerOuter.addHandler(requestLogHandler);
-        
+
         // serve with the outer handler
         server.setHandler(handlerOuter);
 
         // start the JS thread
 //        JavaScriptRunner.runThreaded("server/main.js", null, null);
-        
+
         // start the server
         try {
             server.start();
@@ -111,10 +123,10 @@
         catch (IOException e) {
             throw e;
         }
-        
+
         Main.info("HTTP server started at http://" + niceHostName + ":" + settings.getHttpPort());
-        
+
         return server;
     }
-    
+
 }
diff --git a/weinre.server/src/weinre/server/http/HttpSocketHandler.java b/weinre.server/src/weinre/server/http/HttpSocketHandler.java
index 4e39082..1da4f2a 100644
--- a/weinre.server/src/weinre/server/http/HttpSocketHandler.java
+++ b/weinre.server/src/weinre/server/http/HttpSocketHandler.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server.http;
@@ -31,28 +43,28 @@
 
 //-------------------------------------------------------------------
 public class HttpSocketHandler extends AbstractHandler {
-    private String pathPrefix; 
+    private String pathPrefix;
     private int    pathPrefixParts;
-    
+
     //---------------------------------------------------------------
     public HttpSocketHandler(String pathPrefix) {
         super();
-        
+
         this.pathPrefix      = pathPrefix;
         this.pathPrefixParts = pathPrefix.split("/").length;
     }
-    
+
     //---------------------------------------------------------------
     @Override
     public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
         // ! * pathPrefix*
         if (!target.startsWith(pathPrefix)) return;
-        
+
         String method = baseRequest.getMethod();
-        
+
         setCORSHeaders(response);
         setCacheHeaders(response);
-        
+
         // OPTIONS pathPrefix
         if (target.equals(pathPrefix) && method.equals("OPTIONS")) {
             baseRequest.setHandled(true);
@@ -73,43 +85,43 @@
             response.sendError(405);
             return;
         }
-        
+
         // * pathPrefix/x/*
         String[] parts = target.split("/");
         if (parts.length != pathPrefixParts + 1) {
             baseRequest.setHandled(true);
             response.sendError(404);
         }
-        
-        // 
+
+        //
         if (parts.length <= pathPrefixParts) {
             baseRequest.setHandled(true);
             response.sendError(405);
         }
-        
+
         String channel = parts[pathPrefixParts];
-        
+
         // OPTIONS pathPrefix/x
         if (method.equals("OPTIONS")) {
             baseRequest.setHandled(true);
             handleOptions(target, baseRequest, request, response);
             return;
         }
-        
+
         // GET pathPrefix/x
         if (method.equals("GET")) {
             baseRequest.setHandled(true);
             handleGet(channel, target, baseRequest, request, response);
             return;
         }
-        
+
         // POST pathPrefix/x
         if (method.equals("POST")) {
             baseRequest.setHandled(true);
             handlePost(channel, target, baseRequest, request, response);
             return;
         }
-        
+
         // * pathPrefix/x
         baseRequest.setHandled(true);
         response.sendError(405);
@@ -121,7 +133,7 @@
         response.setHeader("Access-Control-Max-Age", "600");
         response.setHeader("Access-Control-Allow-Methods", "GET, POST");
     }
-    
+
     //---------------------------------------------------------------
     private void setCacheHeaders(HttpServletResponse response) {
         response.setHeader("Pragma",        "no-cache");
@@ -129,7 +141,7 @@
         response.setHeader("Cache-Control", "no-cache");
         response.setHeader("Cache-Control", "no-store");
     }
-    
+
     //---------------------------------------------------------------
     public void handleOptions(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
         response.setStatus(200);
@@ -144,7 +156,7 @@
         if (0 == baseRequest.getContentLength()) {
             id = Channel.AnonymousId;
         }
-        
+
         else {
             try {
                 String json = readRequestBody(request.getInputStream());
@@ -168,15 +180,15 @@
                 return;
             }
         }
-        
+
         ChannelManager.$.registerChannel(pathPrefix, channelName, id, request.getRemoteHost(), request.getRemoteAddr());
-        
+
         response.setStatus(200);
         response.setContentType("application/json");
-        
+
         ServletOutputStream oStream = response.getOutputStream();
         JSONObject obj = new JSONObject();
-        
+
         try {
             obj.put("channel", channelName);
             obj.put("id", id);
@@ -184,7 +196,7 @@
         catch (JSONException e) {
             throw new RuntimeException(e);
         }
-        
+
         String result = obj.toString();
         oStream.print(result);
         oStream.close();
@@ -199,15 +211,15 @@
         }
 
         channel.updateLastRead();
-        
-        List<String> json; 
+
+        List<String> json;
         try {
             json = channel.getResponses(Main.getSettings().getReadTimeoutSeconds());
-        } 
+        }
         catch (InterruptedException e) {
             throw new IOException(e);
         }
-        
+
         response.setStatus(200);
         response.setContentType("application/json");
 
@@ -221,12 +233,12 @@
     private void printJSONList(ServletOutputStream oStream, List<String> json) throws IOException {
         try {
             oStream.print(new JSONArray(json).toString());
-        } 
+        }
         catch (JSONException e) {
             throw new RuntimeException(e);
         }
     }
-    
+
     //---------------------------------------------------------------
     public void handlePost(String channelName, String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
         Channel channel = ChannelManager.$.getChannel(channelName, request.getRemoteAddr());
@@ -244,7 +256,7 @@
             response.setStatus(400);
             return;
         }
-        
+
         try {
             String json = readRequestBody(request.getInputStream());
             channel.postRequest(json);
@@ -253,23 +265,23 @@
             response.setStatus(400);
             return;
         }
-        
+
         response.setStatus(200);
         response.setContentType("text/plain");
         response.getOutputStream().close();
     }
-    
+
     //---------------------------------------------------------------
     private String readRequestBody(InputStream is) throws IOException {
         StringBuffer stringBuffer = new StringBuffer();
         Reader       reader       = new InputStreamReader(is, "UTF-8");
         char[]       buffer       = new char[4096];
-        
+
         int read;
         while ((read = reader.read(buffer)) > 0) {
             stringBuffer.append(buffer, 0, read);
         }
-        
+
         return stringBuffer.toString();
     }
 }
diff --git a/weinre.server/src/weinre/server/http/ProxyServer.java b/weinre.server/src/weinre/server/http/ProxyServer.java
index e290bd7..1150424 100644
--- a/weinre.server/src/weinre/server/http/ProxyServer.java
+++ b/weinre.server/src/weinre/server/http/ProxyServer.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server.http;
@@ -25,22 +37,22 @@
 //-------------------------------------------------------------------
 public class ProxyServer {
     private ServerSettings settings;
-    
+
     //---------------------------------------------------------------
     public ProxyServer(ServerSettings settings) {
         super();
-        
+
         this.settings = settings;
     }
-    
+
     //---------------------------------------------------------------
     public void run() throws Exception {
         SelectChannelConnector connector = new SelectChannelConnector();
 
         connector = new SelectChannelConnector();
-        
-        String hostName = settings.getBoundHost(); 
-        
+
+        String hostName = settings.getBoundHost();
+
         connector.setHost(hostName);
         connector.setPort(settings.getHttpPort()+1);
         connector.setReuseAddress(false);
@@ -49,30 +61,30 @@
         proxyServer.setConnectors(new Connector[] { connector });
 
         HandlerList handlers = new HandlerList();
-        
+
         handlers = new HandlerList();
 
         RequestLogHandler requestLogHandler = new RequestLogHandler();
-        
+
         requestLogHandler = new RequestLogHandler();
-        
+
         NCSARequestLog requestLog;
-        
+
         requestLog = new NCSARequestLog();
         requestLog.setRetainDays(90);
         requestLog.setAppend(true);
         requestLog.setExtended(false);
         requestLog.setLogTimeZone("GMT");
         requestLogHandler.setRequestLog(requestLog);
-        
+
         handlers.addHandler(requestLogHandler);
-        
+
         ServletContextHandler handlerProxy = new ServletContextHandler();
         handlerProxy.setContextPath("/");
         ProxyServlet proxyServlet = new ProxyServlet();
         handlerProxy.addServlet(new ServletHolder(proxyServlet), "/");
         handlers.addHandler(handlerProxy);
-        
+
         proxyServer.setHandler(handlers);
 
         try {
@@ -82,7 +94,7 @@
             Main.warn("unable to start proxy server: " + e.getMessage());
             proxyServer.stop();
         }
-        
+
         Main.info("HTTP proxy server started at http://" + settings.getNiceHostName() + ":" + (settings.getHttpPort()+1));
     }
 }
diff --git a/weinre.server/src/weinre/server/service/WeinreClientCommands.java b/weinre.server/src/weinre/server/service/WeinreClientCommands.java
index 7dcf1a8..3d5e16d 100644
--- a/weinre.server/src/weinre/server/service/WeinreClientCommands.java
+++ b/weinre.server/src/weinre/server/service/WeinreClientCommands.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server.service;
@@ -27,9 +39,9 @@
     //---------------------------------------------------------------
     public void registerClient(Channel channel, String callbackId) throws IOException {
         Client client = new Client(channel);
-        
+
         JSONObject description = client.getDescription();
-        
+
         channel.sendCallback("WeinreClientEvents", callbackId, description);
         channel.sendEvent("WeinreClientEvents", "serverProperties", Main.getSettings().asProperties());
     }
@@ -38,11 +50,11 @@
     public void getTargets(Channel channel, String callbackId) throws IOException {
         List<Target> targets = ConnectionManager.$.getTargets(channel.getId());
         JSONArray targetResults = new JSONArray();
-        
+
         for (Target target: targets) {
             targetResults.add(target.getDescription());
         }
-        
+
         channel.sendCallback("WeinreClientEvents", callbackId, targetResults);
     }
 
@@ -50,11 +62,11 @@
     public void getClients(Channel channel, String callbackId) throws IOException {
         List<Client> clients = ConnectionManager.$.getClients(channel.getId());
         JSONArray clientResults = new JSONArray();
-        
+
         for (Client client: clients) {
             clientResults.add(client.getDescription());
         }
-        
+
         channel.sendCallback("WeinreClientEvents", callbackId, clientResults);
     }
 
@@ -62,19 +74,19 @@
     public void getExtensions(Channel channel, String callbackId) throws IOException {
         String[]  extensions = ExtensionManager.getExtensions();
         JSONArray result     = new JSONArray();
-        
+
         try {
             for (String extension: extensions) {
                 JSONObject extensionObject = new JSONObject();
                 extensionObject.put("startPage", "extensions/" + extension + "/extension.html");
-                
+
                 result.add(extensionObject);
             }
         }
         catch(JSONException e) {
             throw new RuntimeException(e);
         }
-        
+
         channel.sendCallback("WeinreClientEvents", callbackId, result);
     }
 
@@ -85,7 +97,7 @@
 
         Target target = ConnectionManager.$.getTarget(targetId);
         if (target == null) return;
-        
+
         ConnectionManager.$.connect(client, target);
     }
 
@@ -93,13 +105,13 @@
     public void disconnectTarget(Channel channel, String clientId, String callbackId) {
         Client client = ConnectionManager.$.getClient(clientId);
         if (client == null) return;
-        
+
         Target target = client.getConnectedTarget();
         if (target == null) return;
-        
+
         ConnectionManager.$.disconnect(client, target);
     }
-    
+
     //---------------------------------------------------------------
     public void logDebug(Channel channel, String message, String callbackId) {
         Main.debug("client " + channel.getName() + ": " + message);
diff --git a/weinre.server/src/weinre/server/service/WeinreTargetCommands.java b/weinre.server/src/weinre/server/service/WeinreTargetCommands.java
index 80e9a22..139d45c 100644
--- a/weinre.server/src/weinre/server/service/WeinreTargetCommands.java
+++ b/weinre.server/src/weinre/server/service/WeinreTargetCommands.java
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 package weinre.server.service;
@@ -23,28 +35,28 @@
     //---------------------------------------------------------------
     public void registerTarget(Channel channel, String url, String callbackId) throws IOException {
         Target target = new Target(channel, url);
-        
+
         JSONObject description = target.getDescription();
-        
+
         channel.sendCallback("WeinreTargetEvents", callbackId, description);
     }
-    
+
     //---------------------------------------------------------------
     @SuppressWarnings("unchecked")
     public void sendClientCallback(Channel channel, String clientCallbackId, Object args, String callbackId) throws IOException {
         Object[] argsArray;
-        if (null == args) 
+        if (null == args)
             argsArray = new Object[0];
-        else 
+        else
             argsArray = ((List<Object>) args).toArray();
-        
+
         // the channel to send the callback to is embedded in the callbackId
         String callbackConnectorId = getCallbackConnectorId(clientCallbackId);
         if (null == callbackConnectorId) {
             Main.warn(getClass().getName() + ".sendClientCallback() sent with invalid callbackId: " + clientCallbackId);
             return;
         }
-        
+
         channel = ChannelManager.$.getChannel(callbackConnectorId);
         if (null == channel) {
             // indication that channel was closed; this message may generate a lot of noise
@@ -54,7 +66,7 @@
 
         channel.sendCallback("WeinreClientEvents", clientCallbackId, argsArray);
     }
-    
+
     //---------------------------------------------------------------
     public void logDebug(Channel channel, String message, String callbackId) {
         Main.debug("target " + channel.getName() + ": " + message);
@@ -80,5 +92,5 @@
         int index = callbackId.indexOf("::");
         return callbackId.substring(0, index);
     }
-    
+
 }
diff --git a/weinre.web/client/ExtensionRegistryStub.js b/weinre.web/client/ExtensionRegistryStub.js
index 396f3f1..6937fdb 100644
--- a/weinre.web/client/ExtensionRegistryStub.js
+++ b/weinre.web/client/ExtensionRegistryStub.js
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2011 IBM Corporation
+ *     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.
  */
 
 (function() {
diff --git a/weinre.web/client/InspectorBackendStub.js b/weinre.web/client/InspectorBackendStub.js
index f8d41f2..645163c 100644
--- a/weinre.web/client/InspectorBackendStub.js
+++ b/weinre.web/client/InspectorBackendStub.js
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
  */
 
 (function() {
diff --git a/weinre.web/client/InspectorFrontendHostStub.js b/weinre.web/client/InspectorFrontendHostStub.js
index 65f648b..5bca358 100644
--- a/weinre.web/client/InspectorFrontendHostStub.js
+++ b/weinre.web/client/InspectorFrontendHostStub.js
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
  */
 
 (function() {
diff --git a/weinre.web/client/web-inspector-API.js b/weinre.web/client/web-inspector-API.js
index e7fd7b0..b8415a0 100644
--- a/weinre.web/client/web-inspector-API.js
+++ b/weinre.web/client/web-inspector-API.js
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2011 IBM Corporation
+ * 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.
  */
- 
+
 eval(window.top.installWebInspectorAPIsource())
diff --git a/weinre.web/client/weinre/check-for-webkit.js b/weinre.web/client/weinre/check-for-webkit.js
index 249e80d..1b66a5f 100644
--- a/weinre.web/client/weinre/check-for-webkit.js
+++ b/weinre.web/client/weinre/check-for-webkit.js
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
  */
 
 if (!navigator.userAgent.match(/webkit/i)) {
diff --git a/weinre.web/client/weinre/client.css b/weinre.web/client/weinre/client.css
index 383cf96..6e3ae73 100644
--- a/weinre.web/client/weinre/client.css
+++ b/weinre.web/client/weinre/client.css
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
  */
 
 .toolbar-item.remote .toolbar-icon {
diff --git a/weinre.web/client/weinre/hacks.js b/weinre.web/client/weinre/hacks.js
index f2156c7..28b12ad 100644
--- a/weinre.web/client/weinre/hacks.js
+++ b/weinre.web/client/weinre/hacks.js
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 // a place for hacks
diff --git a/weinre.web/demo/weinre-demo-min.html b/weinre.web/demo/weinre-demo-min.html
index 95893a3..4ba3058 100644
--- a/weinre.web/demo/weinre-demo-min.html
+++ b/weinre.web/demo/weinre-demo-min.html
@@ -1,8 +1,20 @@
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <html>
diff --git a/weinre.web/demo/weinre-demo.css b/weinre.web/demo/weinre-demo.css
index ec6d164..a83598a 100644
--- a/weinre.web/demo/weinre-demo.css
+++ b/weinre.web/demo/weinre-demo.css
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2011 IBM Corporation
+ * 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.
  */
 
 h1 {
diff --git a/weinre.web/demo/weinre-demo.html b/weinre.web/demo/weinre-demo.html
index 70c887e..ba3330a 100644
--- a/weinre.web/demo/weinre-demo.html
+++ b/weinre.web/demo/weinre-demo.html
@@ -1,8 +1,20 @@
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <html>
diff --git a/weinre.web/demo/weinre-demo.js b/weinre.web/demo/weinre-demo.js
index 5e36af4..06de5f9 100644
--- a/weinre.web/demo/weinre-demo.js
+++ b/weinre.web/demo/weinre-demo.js
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2011 IBM Corporation
+ *     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.
  */
 
 //------------------------------------------------------------------------------
diff --git a/weinre.web/index.html b/weinre.web/index.html
index a4861d5..3afbc14 100644
--- a/weinre.web/index.html
+++ b/weinre.web/index.html
@@ -1,10 +1,22 @@
 <!doctype html>
 
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <html>
diff --git a/weinre.web/index.js b/weinre.web/index.js
index 7e248a6..86e8508 100644
--- a/weinre.web/index.js
+++ b/weinre.web/index.js
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
  */
 
 var weinre_protocol = location.protocol
diff --git a/weinre.web/interfaces/interfaces.css b/weinre.web/interfaces/interfaces.css
index ee1a8c5..c0931f8 100644
--- a/weinre.web/interfaces/interfaces.css
+++ b/weinre.web/interfaces/interfaces.css
@@ -1,14 +1,26 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
- * 
- * Copyright (c) 2010, 2011 IBM Corporation
+ * 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.
  */
 
 #browser {
     margin-top:  1em;
 }
- 
+
 #interface-picker {
     float:         left;
     margin-right:  1.0em;
@@ -20,7 +32,7 @@
     margin-top:    0.0em;
     border-bottom: thin solid;
 }
- 
+
 #interface-content {
     overflow:     hidden;
     padding-left: 1.0em;
@@ -43,7 +55,7 @@
 .indent {
     white-space: pre;
 }
- 
+
 .attributeName, .methodName, .interfaceName {
     font-weight: bold;
 }
@@ -72,7 +84,7 @@
     .noprint {
         display: none;
     }
-    
+
     body {
         font-size: 60%;
     }
diff --git a/weinre.web/interfaces/interfaces.html b/weinre.web/interfaces/interfaces.html
index 107df67..9797ebf 100644
--- a/weinre.web/interfaces/interfaces.html
+++ b/weinre.web/interfaces/interfaces.html
@@ -1,10 +1,22 @@
 <!doctype html>
 
 <!--
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
 -->
 
 <html>
diff --git a/weinre.web/interfaces/interfaces.js b/weinre.web/interfaces/interfaces.js
index 8b9e7de..29ea125 100644
--- a/weinre.web/interfaces/interfaces.js
+++ b/weinre.web/interfaces/interfaces.js
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
  */
 
 ;(function(){
diff --git a/weinre.web/modules/weinre/client/Client.coffee b/weinre.web/modules/weinre/client/Client.coffee
index 514ba97..c85b126 100644
--- a/weinre.web/modules/weinre/client/Client.coffee
+++ b/weinre.web/modules/weinre/client/Client.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 IDLTools          = require('../common/IDLTools')
diff --git a/weinre.web/modules/weinre/client/ConnectorList.coffee b/weinre.web/modules/weinre/client/ConnectorList.coffee
index e1a50fb..2361437 100644
--- a/weinre.web/modules/weinre/client/ConnectorList.coffee
+++ b/weinre.web/modules/weinre/client/ConnectorList.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 dt = require('./DOMTemplates')
diff --git a/weinre.web/modules/weinre/client/DOMTemplates.coffee b/weinre.web/modules/weinre/client/DOMTemplates.coffee
index a3db299..2f33837 100644
--- a/weinre.web/modules/weinre/client/DOMTemplates.coffee
+++ b/weinre.web/modules/weinre/client/DOMTemplates.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Ex = require('../common/Ex')
diff --git a/weinre.web/modules/weinre/client/ExtensionRegistryImpl.coffee b/weinre.web/modules/weinre/client/ExtensionRegistryImpl.coffee
index 4303d2d..79cce5d 100644
--- a/weinre.web/modules/weinre/client/ExtensionRegistryImpl.coffee
+++ b/weinre.web/modules/weinre/client/ExtensionRegistryImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Ex      = require('../common/Ex')
diff --git a/weinre.web/modules/weinre/client/InspectorBackendImpl.coffee b/weinre.web/modules/weinre/client/InspectorBackendImpl.coffee
index 1dcf45e..8a7cabb 100644
--- a/weinre.web/modules/weinre/client/InspectorBackendImpl.coffee
+++ b/weinre.web/modules/weinre/client/InspectorBackendImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Ex                = require('../common/Ex')
diff --git a/weinre.web/modules/weinre/client/InspectorFrontendHostImpl.coffee b/weinre.web/modules/weinre/client/InspectorFrontendHostImpl.coffee
index b060469..d4e258b 100644
--- a/weinre.web/modules/weinre/client/InspectorFrontendHostImpl.coffee
+++ b/weinre.web/modules/weinre/client/InspectorFrontendHostImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Weinre   = require('../common/Weinre')
diff --git a/weinre.web/modules/weinre/client/RemotePanel.coffee b/weinre.web/modules/weinre/client/RemotePanel.coffee
index a6c6110..f191ee7 100644
--- a/weinre.web/modules/weinre/client/RemotePanel.coffee
+++ b/weinre.web/modules/weinre/client/RemotePanel.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Binding       = require('../common/Binding')
diff --git a/weinre.web/modules/weinre/client/WeinreClientEventsImpl.coffee b/weinre.web/modules/weinre/client/WeinreClientEventsImpl.coffee
index a3e4038..8fcec0d 100644
--- a/weinre.web/modules/weinre/client/WeinreClientEventsImpl.coffee
+++ b/weinre.web/modules/weinre/client/WeinreClientEventsImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Callback                    = require('../common/Callback')
diff --git a/weinre.web/modules/weinre/client/WeinreExtraTargetEventsImpl.coffee b/weinre.web/modules/weinre/client/WeinreExtraTargetEventsImpl.coffee
index 66c88d3..7958560 100644
--- a/weinre.web/modules/weinre/client/WeinreExtraTargetEventsImpl.coffee
+++ b/weinre.web/modules/weinre/client/WeinreExtraTargetEventsImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 module.exports = class WeinreExtraTargetEventsImpl
diff --git a/weinre.web/modules/weinre/common/Binding.coffee b/weinre.web/modules/weinre/common/Binding.coffee
index ad7ab14..f131a21 100644
--- a/weinre.web/modules/weinre/common/Binding.coffee
+++ b/weinre.web/modules/weinre/common/Binding.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Ex = require('./Ex')
diff --git a/weinre.web/modules/weinre/common/Callback.coffee b/weinre.web/modules/weinre/common/Callback.coffee
index ee2baf2..90b0338 100644
--- a/weinre.web/modules/weinre/common/Callback.coffee
+++ b/weinre.web/modules/weinre/common/Callback.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Ex = require('./Ex')
diff --git a/weinre.web/modules/weinre/common/EventListeners.coffee b/weinre.web/modules/weinre/common/EventListeners.coffee
index 535b48f..a0a520f 100644
--- a/weinre.web/modules/weinre/common/EventListeners.coffee
+++ b/weinre.web/modules/weinre/common/EventListeners.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Ex     = require('./Ex')
diff --git a/weinre.web/modules/weinre/common/Ex.coffee b/weinre.web/modules/weinre/common/Ex.coffee
index 4062188..16b4930 100644
--- a/weinre.web/modules/weinre/common/Ex.coffee
+++ b/weinre.web/modules/weinre/common/Ex.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 StackTrace = require('./StackTrace')
diff --git a/weinre.web/modules/weinre/common/HookLib.coffee b/weinre.web/modules/weinre/common/HookLib.coffee
index 9f2b868..45ecdac 100644
--- a/weinre.web/modules/weinre/common/HookLib.coffee
+++ b/weinre.web/modules/weinre/common/HookLib.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 HookLib = exports
diff --git a/weinre.web/modules/weinre/common/IDGenerator.coffee b/weinre.web/modules/weinre/common/IDGenerator.coffee
index 0a4f599..b45120b 100644
--- a/weinre.web/modules/weinre/common/IDGenerator.coffee
+++ b/weinre.web/modules/weinre/common/IDGenerator.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 nextIdValue = 1
diff --git a/weinre.web/modules/weinre/common/IDLTools.coffee b/weinre.web/modules/weinre/common/IDLTools.coffee
index a989836..e227c5f 100644
--- a/weinre.web/modules/weinre/common/IDLTools.coffee
+++ b/weinre.web/modules/weinre/common/IDLTools.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Ex       = require('./Ex')
diff --git a/weinre.web/modules/weinre/common/MessageDispatcher.coffee b/weinre.web/modules/weinre/common/MessageDispatcher.coffee
index a732cad..404a951 100644
--- a/weinre.web/modules/weinre/common/MessageDispatcher.coffee
+++ b/weinre.web/modules/weinre/common/MessageDispatcher.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Weinre       = require('./Weinre')
diff --git a/weinre.web/modules/weinre/common/MethodNamer.coffee b/weinre.web/modules/weinre/common/MethodNamer.coffee
index 4d5c755..16aaaef 100644
--- a/weinre.web/modules/weinre/common/MethodNamer.coffee
+++ b/weinre.web/modules/weinre/common/MethodNamer.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 module.exports = class MethodNamer
diff --git a/weinre.web/modules/weinre/common/StackTrace.coffee b/weinre.web/modules/weinre/common/StackTrace.coffee
index b7ace3f..08350e1 100644
--- a/weinre.web/modules/weinre/common/StackTrace.coffee
+++ b/weinre.web/modules/weinre/common/StackTrace.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 module.exports = class StackTrace
diff --git a/weinre.web/modules/weinre/common/WebSocketXhr.coffee b/weinre.web/modules/weinre/common/WebSocketXhr.coffee
index 00c741e..4fc86db 100644
--- a/weinre.web/modules/weinre/common/WebSocketXhr.coffee
+++ b/weinre.web/modules/weinre/common/WebSocketXhr.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Ex             = require('./Ex')
diff --git a/weinre.web/modules/weinre/common/Weinre.coffee b/weinre.web/modules/weinre/common/Weinre.coffee
index decb80b..27e072b 100644
--- a/weinre.web/modules/weinre/common/Weinre.coffee
+++ b/weinre.web/modules/weinre/common/Weinre.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Ex         = require('./Ex')
diff --git a/weinre.web/modules/weinre/target/CSSStore.coffee b/weinre.web/modules/weinre/target/CSSStore.coffee
index b1b350e..e2aa6b3 100644
--- a/weinre.web/modules/weinre/target/CSSStore.coffee
+++ b/weinre.web/modules/weinre/target/CSSStore.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 IDGenerator = require('../common/IDGenerator')
diff --git a/weinre.web/modules/weinre/target/CheckForProblems.coffee b/weinre.web/modules/weinre/target/CheckForProblems.coffee
index cb30171..a19d202 100644
--- a/weinre.web/modules/weinre/target/CheckForProblems.coffee
+++ b/weinre.web/modules/weinre/target/CheckForProblems.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 module.exports = class CheckForProblems
diff --git a/weinre.web/modules/weinre/target/Console.coffee b/weinre.web/modules/weinre/target/Console.coffee
index 800c84f..76576c3 100644
--- a/weinre.web/modules/weinre/target/Console.coffee
+++ b/weinre.web/modules/weinre/target/Console.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Weinre   = require('../common/Weinre')
diff --git a/weinre.web/modules/weinre/target/ElementHighlighter.coffee b/weinre.web/modules/weinre/target/ElementHighlighter.coffee
index 52d0aed..991e9c1 100644
--- a/weinre.web/modules/weinre/target/ElementHighlighter.coffee
+++ b/weinre.web/modules/weinre/target/ElementHighlighter.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 canvasAvailable           = null
diff --git a/weinre.web/modules/weinre/target/ElementHighlighterDivs2.coffee b/weinre.web/modules/weinre/target/ElementHighlighterDivs2.coffee
index 8185160..a289114 100644
--- a/weinre.web/modules/weinre/target/ElementHighlighterDivs2.coffee
+++ b/weinre.web/modules/weinre/target/ElementHighlighterDivs2.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 ElementHighlighter = require('./ElementHighlighter')
diff --git a/weinre.web/modules/weinre/target/HookSites.coffee b/weinre.web/modules/weinre/target/HookSites.coffee
index 13dedb1..d3ac492 100644
--- a/weinre.web/modules/weinre/target/HookSites.coffee
+++ b/weinre.web/modules/weinre/target/HookSites.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 HookLib = require('../common/HookLib')
diff --git a/weinre.web/modules/weinre/target/InjectedScriptHostImpl.coffee b/weinre.web/modules/weinre/target/InjectedScriptHostImpl.coffee
index d1553c6..0358fd9 100644
--- a/weinre.web/modules/weinre/target/InjectedScriptHostImpl.coffee
+++ b/weinre.web/modules/weinre/target/InjectedScriptHostImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Weinre = require('../common/Weinre')
diff --git a/weinre.web/modules/weinre/target/NetworkRequest.coffee b/weinre.web/modules/weinre/target/NetworkRequest.coffee
index 64849d1..076fa5d 100644
--- a/weinre.web/modules/weinre/target/NetworkRequest.coffee
+++ b/weinre.web/modules/weinre/target/NetworkRequest.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 StackTrace  = require('../common/StackTrace')
diff --git a/weinre.web/modules/weinre/target/NodeStore.coffee b/weinre.web/modules/weinre/target/NodeStore.coffee
index edd0269..b12fe1f 100644
--- a/weinre.web/modules/weinre/target/NodeStore.coffee
+++ b/weinre.web/modules/weinre/target/NodeStore.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Weinre      = require('../common/Weinre')
diff --git a/weinre.web/modules/weinre/target/SqlStepper.coffee b/weinre.web/modules/weinre/target/SqlStepper.coffee
index 82b5997..b8c65b4 100644
--- a/weinre.web/modules/weinre/target/SqlStepper.coffee
+++ b/weinre.web/modules/weinre/target/SqlStepper.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Binding = require('../common/Binding')
diff --git a/weinre.web/modules/weinre/target/Target.coffee b/weinre.web/modules/weinre/target/Target.coffee
index fcbcfd9..3d3eed3 100644
--- a/weinre.web/modules/weinre/target/Target.coffee
+++ b/weinre.web/modules/weinre/target/Target.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Ex                            = require('../common/Ex')
diff --git a/weinre.web/modules/weinre/target/Timeline.coffee b/weinre.web/modules/weinre/target/Timeline.coffee
index f50922c..a66dfed 100644
--- a/weinre.web/modules/weinre/target/Timeline.coffee
+++ b/weinre.web/modules/weinre/target/Timeline.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Ex          = require('../common/Ex')
diff --git a/weinre.web/modules/weinre/target/WeinreExtraClientCommandsImpl.coffee b/weinre.web/modules/weinre/target/WeinreExtraClientCommandsImpl.coffee
index e638355..490eaca 100644
--- a/weinre.web/modules/weinre/target/WeinreExtraClientCommandsImpl.coffee
+++ b/weinre.web/modules/weinre/target/WeinreExtraClientCommandsImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Weinre         = require('../common/Weinre')
diff --git a/weinre.web/modules/weinre/target/WeinreTargetEventsImpl.coffee b/weinre.web/modules/weinre/target/WeinreTargetEventsImpl.coffee
index 65bb187..5f308aa 100644
--- a/weinre.web/modules/weinre/target/WeinreTargetEventsImpl.coffee
+++ b/weinre.web/modules/weinre/target/WeinreTargetEventsImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Weinre   = require('../common/Weinre')
diff --git a/weinre.web/modules/weinre/target/WiCSSImpl.coffee b/weinre.web/modules/weinre/target/WiCSSImpl.coffee
index c5e0932..0ea53f0 100644
--- a/weinre.web/modules/weinre/target/WiCSSImpl.coffee
+++ b/weinre.web/modules/weinre/target/WiCSSImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Weinre = require('../common/Weinre')
diff --git a/weinre.web/modules/weinre/target/WiConsoleImpl.coffee b/weinre.web/modules/weinre/target/WiConsoleImpl.coffee
index 35ab3f7..5ce8dac 100644
--- a/weinre.web/modules/weinre/target/WiConsoleImpl.coffee
+++ b/weinre.web/modules/weinre/target/WiConsoleImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Weinre = require('../common/Weinre')
diff --git a/weinre.web/modules/weinre/target/WiDOMImpl.coffee b/weinre.web/modules/weinre/target/WiDOMImpl.coffee
index 675b5b9..7d83ac8 100644
--- a/weinre.web/modules/weinre/target/WiDOMImpl.coffee
+++ b/weinre.web/modules/weinre/target/WiDOMImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Weinre = require('../common/Weinre')
diff --git a/weinre.web/modules/weinre/target/WiDOMStorageImpl.coffee b/weinre.web/modules/weinre/target/WiDOMStorageImpl.coffee
index b52e9c0..e6b5b19 100644
--- a/weinre.web/modules/weinre/target/WiDOMStorageImpl.coffee
+++ b/weinre.web/modules/weinre/target/WiDOMStorageImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Weinre    = require('../common/Weinre')
diff --git a/weinre.web/modules/weinre/target/WiDatabaseImpl.coffee b/weinre.web/modules/weinre/target/WiDatabaseImpl.coffee
index 0c58b13..7c1cfc6 100644
--- a/weinre.web/modules/weinre/target/WiDatabaseImpl.coffee
+++ b/weinre.web/modules/weinre/target/WiDatabaseImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Weinre      = require('../common/Weinre')
diff --git a/weinre.web/modules/weinre/target/WiInspectorImpl.coffee b/weinre.web/modules/weinre/target/WiInspectorImpl.coffee
index daef844..8e846ea 100644
--- a/weinre.web/modules/weinre/target/WiInspectorImpl.coffee
+++ b/weinre.web/modules/weinre/target/WiInspectorImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Weinre   = require('../common/Weinre')
diff --git a/weinre.web/modules/weinre/target/WiRuntimeImpl.coffee b/weinre.web/modules/weinre/target/WiRuntimeImpl.coffee
index 14c2e77..7a1584c 100644
--- a/weinre.web/modules/weinre/target/WiRuntimeImpl.coffee
+++ b/weinre.web/modules/weinre/target/WiRuntimeImpl.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 Weinre = require('../common/Weinre')
diff --git a/weinre.web/modules/weinre/unused/ElementHighlighterCanvas.coffee b/weinre.web/modules/weinre/unused/ElementHighlighterCanvas.coffee
index 2549466..8532f52 100644
--- a/weinre.web/modules/weinre/unused/ElementHighlighterCanvas.coffee
+++ b/weinre.web/modules/weinre/unused/ElementHighlighterCanvas.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 ElementHighlighter = require('./ElementHighlighter')
diff --git a/weinre.web/modules/weinre/unused/ElementHighlighterDivs4.coffee b/weinre.web/modules/weinre/unused/ElementHighlighterDivs4.coffee
index dea11a1..a851a41 100644
--- a/weinre.web/modules/weinre/unused/ElementHighlighterDivs4.coffee
+++ b/weinre.web/modules/weinre/unused/ElementHighlighterDivs4.coffee
@@ -1,9 +1,21 @@
 
 #---------------------------------------------------------------------------------
-# weinre is available under *either* the terms of the modified BSD license *or* the
-# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
+# 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 (c) 2010, 2011 IBM Corporation
+#     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.
 #---------------------------------------------------------------------------------
 
 ElementHighlighter = require('./ElementHighlighter')
diff --git a/weinre.web/tests/element-highlighter.html b/weinre.web/tests/element-highlighter.html
index d59ef61..f0cd264 100644
--- a/weinre.web/tests/element-highlighter.html
+++ b/weinre.web/tests/element-highlighter.html
@@ -1,3 +1,22 @@
+<!--
+ * 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.
+-->
+
 <html>
 
 <head>
diff --git a/weinre.web/tests/index.html b/weinre.web/tests/index.html
index 54b577a..ca9dd9c 100644
--- a/weinre.web/tests/index.html
+++ b/weinre.web/tests/index.html
@@ -1,3 +1,22 @@
+<!--
+ * 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.
+-->
+
 <html>
 <head>
 <title>weinre.web/tests</title>
diff --git a/weinre.web/versions.js b/weinre.web/versions.js
index af1f435..0e4c545 100644
--- a/weinre.web/versions.js
+++ b/weinre.web/versions.js
@@ -1,8 +1,20 @@
 /*
- * weinre is available under *either* the terms of the modified BSD license *or* the
- * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ * 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 (c) 2010, 2011 IBM Corporation
+ *     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.
  */
 
  if (typeof Weinre == "undefined") Weinre = {};
