diff --git a/fileinstall/fileinstall.bnd b/fileinstall/fileinstall.bnd
new file mode 100644
index 0000000..837d4d9
--- /dev/null
+++ b/fileinstall/fileinstall.bnd
@@ -0,0 +1,8 @@
+-sources: true
+Export-Package: aQute.fileinstall, org.osgi.service.cm
+Bundle-Activator: aQute.fileinstall.FileInstall
+Bundle-Version: 1.3.4
+Bundle-Description: This bundle watches a directory set by the aQute.fileinstall.dir property; the default \
+is "load". JAR files in this directory are installed and uninstalled when they are no longer there. Updating
+ the JAR file in the directory will update the bundle. The bundle allows you to use downloads from
+ a browser, drag and drop, or the command line copy function, for OSGi management.
diff --git a/fileinstall/pom.xml b/fileinstall/pom.xml
new file mode 100644
index 0000000..b12483b
--- /dev/null
+++ b/fileinstall/pom.xml
@@ -0,0 +1,61 @@
+<!--
+ 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <groupId>org.apache.felix</groupId>
+    <artifactId>felix</artifactId>
+    <version>1.0.2</version>
+    <relativePath>../pom/pom.xml</relativePath>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <packaging>bundle</packaging>
+  <name>Apache Felix File Install</name>
+  <description>A utility to automatically install bundles from a directory.</description>
+  <version>0.9.0-SNAPSHOT</version>
+  <artifactId>org.apache.felix.fileinstall</artifactId>
+  <dependencies>
+    <dependency>
+      <groupId>${pom.groupId}</groupId>
+      <artifactId>org.osgi.core</artifactId>
+      <version>1.0.0</version>
+    </dependency>
+    <dependency>
+      <groupId>${pom.groupId}</groupId>
+      <artifactId>org.osgi.compendium</artifactId>
+      <version>1.0.0</version>
+    </dependency>
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <version>1.4.0</version>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Export-Package>org.apache.felix.fileinstall,org.osgi.service.cm</Export-Package>
+            <Bundle-Activator>org.apache.felix.fileinstall.FileInstall</Bundle-Activator>
+            <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+          </instructions>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java b/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java
new file mode 100644
index 0000000..0e52021
--- /dev/null
+++ b/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java
@@ -0,0 +1,407 @@
+/*
+ * 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 org.apache.felix.fileinstall;
+
+/**
+ * -DirectoryWatcher-
+ * 
+ * This class runs a background task that checks a directory for new files or
+ * removed files. These files can be configuration files or jars.
+ */
+import java.io.*;
+import java.util.*;
+
+import org.osgi.framework.*;
+import org.osgi.service.cm.*;
+import org.osgi.service.packageadmin.*;
+
+public class DirectoryWatcher extends Thread
+{
+    final static String ALIAS_KEY = "_alias_factory_pid";
+    public final static String POLL = "felix.fileinstall.poll";
+    public final static String DIR = "felix.fileinstall.dir";
+    public final static String DEBUG = "felix.fileinstall.debug";
+    File jardir;
+    boolean cont = true;
+    long poll = 2000;
+    long debug;
+    Map foundBundles = new HashMap();
+    Map foundConfigs = new HashMap();
+    BundleContext context;
+    boolean reported;
+
+    public DirectoryWatcher(Dictionary properties, BundleContext context)
+    {
+        super(properties.toString());
+        this.context = context;
+        poll = getLong(POLL, poll);
+        debug = getLong(DEBUG, -1);
+
+        String dir = (String) properties.get(DIR);
+        if (dir == null)
+        {
+            dir = "./load";
+        }
+
+        jardir = new File(dir);
+        jardir.mkdirs();
+    }
+
+    long getLong(String property, long dflt)
+    {
+        String value = context.getProperty(property);
+        if (value != null)
+        {
+            try
+            {
+                return Long.parseLong(value);
+            }
+            catch (Exception e)
+            {
+                System.out.println(property + " set, but not a long: " + value);
+            }
+        }
+        return dflt;
+    }
+
+    public void run()
+    {
+        System.out.println(POLL + "  (ms)   " + poll);
+        System.out.println(DIR + "            " + jardir.getAbsolutePath());
+        System.out.println(DEBUG + "          " + debug);
+
+        while (cont)
+        {
+            try
+            {
+                Map installed = new HashMap();
+                Map configs = new HashMap();
+                traverse(installed, configs, jardir);
+                doInstalled(foundBundles, installed);
+                doConfigs(foundConfigs, configs);
+                Thread.sleep(poll);
+            }
+            catch (InterruptedException e)
+            {
+
+            }
+            catch (Throwable e)
+            {
+                log("In main loop, we have serious trouble", e);
+            }
+        }
+    }
+
+    private void doConfigs(Map old, Map newConfigs)
+    {
+        try
+        {
+            Set oldKeys = new HashSet(old.keySet());
+            for (Iterator e = newConfigs.entrySet().iterator(); e.hasNext();)
+            {
+                Map.Entry entry = (Map.Entry) e.next();
+                String path = (String) entry.getKey();
+                File f = (File) entry.getValue();
+                if (!oldKeys.contains(path))
+                {
+                    // new
+                    Long l = new Long(f.lastModified());
+                    if (setConfig(f))
+                    {
+                        old.put(path, l);
+                    }
+                }
+                else
+                {
+                    long lastModified = f.lastModified();
+                    long oldTime = ((Long) old.get(path)).longValue();
+                    if (oldTime < lastModified)
+                    {
+                        if (setConfig(f))
+                        {
+                            old.put(path, new Long(lastModified));
+                        }
+                    }
+                }
+                oldKeys.remove(path);
+            }
+            for (Iterator e = oldKeys.iterator(); e.hasNext();)
+            {
+                String path = (String) e.next();
+                File f = new File(path);
+                if (deleteConfig(f))
+                {
+                    foundConfigs.remove(path);
+                }
+            }
+        }
+        catch (Exception ee)
+        {
+            log("Processing config: ", ee);
+        }
+    }
+
+    private boolean setConfig(File f) throws Exception
+    {
+        ConfigurationAdmin cm = (ConfigurationAdmin) FileInstall.cmTracker.getService();
+        if (cm == null)
+        {
+            if (debug != 0 && !reported)
+            {
+                System.err.println("Can't find a Configuration Manager, configurations do not work");
+                reported = true;
+            }
+            return false;
+        }
+
+        Properties p = new Properties();
+        InputStream in = new FileInputStream(f);
+        p.load(in);
+        in.close();
+        String pid[] = parsePid(f.getName());
+        Hashtable ht = new Hashtable();
+        ht.putAll(p);
+        if (pid[1] != null)
+        {
+            ht.put(ALIAS_KEY, pid[1]);
+        }
+        Configuration config = getConfiguration(pid[0], pid[1]);
+        if (config.getBundleLocation() != null)
+        {
+            config.setBundleLocation(null);
+        }
+        config.update(ht);
+        return true;
+    }
+
+    private boolean deleteConfig(File f) throws Exception
+    {
+        String pid[] = parsePid(f.getName());
+        Configuration config = getConfiguration(pid[0], pid[1]);
+        config.delete();
+        return true;
+    }
+
+    String[] parsePid(String path)
+    {
+        String pid = path.substring(0, path.length() - 4);
+        int n = pid.indexOf('-');
+        if (n > 0)
+        {
+            String factoryPid = pid.substring(n + 1);
+            pid = pid.substring(0, n);
+            return new String[]{pid, factoryPid};
+        }
+        else
+        {
+            return new String[]{pid, null};
+        }
+    }
+
+    private Configuration getConfiguration(String pid, String factoryPid)
+        throws Exception
+    {
+        ConfigurationAdmin cm = (ConfigurationAdmin) FileInstall.cmTracker.getService();
+        if (factoryPid != null)
+        {
+            Configuration configs[] = cm.listConfigurations("(|(" + ALIAS_KEY + "=" + factoryPid + ")(.alias_factory_pid=" + factoryPid + "))");
+            if (configs == null || configs.length == 0)
+            {
+                return cm.createFactoryConfiguration(pid, null);
+            }
+            else
+            {
+                return configs[0];
+            }
+        }
+        else
+        {
+            return cm.getConfiguration(pid, null);
+        }
+    }
+
+    private void doInstalled(Map sizes, Map installed)
+    {
+        boolean refresh = false;
+        Bundle bundles[] = context.getBundles();
+        for (int i = 0; i < bundles.length; i++)
+        {
+            Bundle bundle = bundles[i];
+            String location = bundle.getLocation();
+            File file = (File) installed.get(location);
+            if (file != null)
+            {
+                // Modified date does not work on the Nokia
+                // for some reason, so we take size into account
+                // as well.
+                long newSize = file.length();
+                Long oldSizeObj = (Long) sizes.get(location);
+                long oldSize = oldSizeObj == null ? 0 : oldSizeObj.longValue();
+
+                installed.remove(location);
+                if (file.lastModified() > bundle.getLastModified() + 4000 && oldSize != newSize)
+                {
+                    try
+                    {
+                        sizes.put(location, new Long(newSize));
+                        InputStream in = new FileInputStream(file);
+                        bundle.update(in);
+                        refresh = true;
+                        in.close();
+                        log("Updated " + location, null);
+                    }
+                    catch (Exception e)
+                    {
+                        log("Failed to update bundle ", e);
+                    }
+                }
+                if (!isFragment(bundle))
+                {
+                    try
+                    {
+                        bundle.start();
+                    }
+                    catch (Exception e)
+                    {
+                        log("Fail to start bundle " + location, e);
+                    }
+                }
+            }
+            else
+            {
+                if (bundle.getLocation().startsWith(jardir.getAbsolutePath()))
+                {
+                    try
+                    {
+                        bundle.uninstall();
+                        refresh = true;
+                        log("Uninstalled " + location, null);
+                    }
+                    catch (Exception e)
+                    {
+                        log("failed to uninstall bundle: ", e);
+                    }
+                }
+            }
+        }
+
+        for (Iterator it = installed.values().iterator(); it.hasNext();)
+        {
+            try
+            {
+                File file = (File) it.next();
+                InputStream in = new FileInputStream(file);
+                Bundle bundle = context.installBundle(file.getAbsolutePath(),
+                    in);
+                refresh = true;
+                in.close();
+                if (!isFragment(bundle))
+                {
+                    bundle.start();
+                }
+                log("Installed " + file.getAbsolutePath(), null);
+            }
+            catch (Exception e)
+            {
+                log("failed to install/start bundle: ", e);
+            }
+        }
+        if (refresh)
+        {
+            refresh();
+        }
+    }
+
+    private void log(String string, Throwable e)
+    {
+        System.err.println(string + ": " + e);
+        if (debug > 0 && e != null)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    private void traverse(Map jars, Map configs, File jardir2)
+    {
+        String list[] = jardir.list();
+        for (int i = 0; i < list.length; i++)
+        {
+            File file = new File(jardir2, list[i]);
+            if (list[i].endsWith(".jar"))
+            {
+                jars.put(file.getAbsolutePath(), file);
+            }
+            else if (list[i].endsWith(".cfg"))
+            {
+                configs.put(file.getAbsolutePath(), file);
+            }
+        }
+    }
+
+    private boolean isFragment(Bundle bundle)
+    {
+        PackageAdmin padmin;
+        if (FileInstall.padmin == null)
+        {
+            return false;
+        }
+
+        try
+        {
+            padmin = (PackageAdmin) FileInstall.padmin.waitForService(10000);
+            if (padmin != null)
+            {
+                return padmin.getBundleType(bundle) == PackageAdmin.BUNDLE_TYPE_FRAGMENT;
+            }
+        }
+        catch (InterruptedException e)
+        {
+        // stupid exception
+        }
+        return false;
+    }
+
+    private void refresh()
+    {
+        PackageAdmin padmin;
+        try
+        {
+            padmin = (PackageAdmin) FileInstall.padmin.waitForService(10000);
+            padmin.refreshPackages(null);
+        }
+        catch (InterruptedException e)
+        {
+        // stupid exception
+        }
+    }
+
+    public void close()
+    {
+        cont = false;
+        interrupt();
+        try
+        {
+            join(10000);
+        }
+        catch (InterruptedException ie)
+        {
+        // Ignore
+        }
+    }
+}
\ No newline at end of file
diff --git a/fileinstall/src/main/java/org/apache/felix/fileinstall/FileInstall.java b/fileinstall/src/main/java/org/apache/felix/fileinstall/FileInstall.java
new file mode 100644
index 0000000..9f4dbd9
--- /dev/null
+++ b/fileinstall/src/main/java/org/apache/felix/fileinstall/FileInstall.java
@@ -0,0 +1,112 @@
+/*
+ * 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 org.apache.felix.fileinstall;
+
+import java.util.*;
+
+import org.osgi.framework.*;
+import org.osgi.service.cm.*;
+import org.osgi.service.packageadmin.*;
+import org.osgi.util.tracker.*;
+
+/**
+ * This clever little bundle watches a directory and will install any jar file
+ * if finds in that directory (as long as it is a valid bundle and not a
+ * fragment).
+ * 
+ */
+public class FileInstall implements BundleActivator, ManagedServiceFactory
+{
+    static ServiceTracker padmin;
+    static ServiceTracker cmTracker;
+    BundleContext context;
+    Map watchers = new HashMap();
+
+    public void start(BundleContext context) throws Exception
+    {
+        this.context = context;
+        Hashtable props = new Hashtable();
+        props.put(Constants.SERVICE_PID, getName());
+        context.registerService(ManagedServiceFactory.class.getName(), this, props);
+
+        padmin = new ServiceTracker(context, PackageAdmin.class.getName(), null);
+        padmin.open();
+        cmTracker = new ServiceTracker(context, ConfigurationAdmin.class.getName(), null);
+        cmTracker.open();
+
+        // Created the initial configuration
+        Hashtable ht = new Hashtable();
+        set(ht, DirectoryWatcher.POLL);
+        set(ht, DirectoryWatcher.DIR);
+        set(ht, DirectoryWatcher.DEBUG);
+        updated("initial", ht);
+    }
+
+    private void set(Hashtable ht, String key)
+    {
+        Object o = context.getProperty(key);
+        if (o == null)
+        {
+            return;
+        }
+        ht.put(key, o);
+    }
+
+    public void stop(BundleContext context) throws Exception
+    {
+        for (Iterator w = watchers.values().iterator(); w.hasNext();)
+        {
+            try
+            {
+                DirectoryWatcher dir = (DirectoryWatcher) w.next();
+                w.remove();
+                dir.close();
+            }
+            catch (Exception e)
+            {
+            // Ignore
+            }
+        }
+        cmTracker.close();
+        padmin.close();
+    }
+
+    public void deleted(String pid)
+    {
+        DirectoryWatcher watcher = (DirectoryWatcher) watchers.remove(pid);
+        if (watcher != null)
+        {
+            watcher.close();
+        }
+    }
+
+    public String getName()
+    {
+        return "org.apache.felix.fileinstall";
+    }
+
+    public void updated(String pid, Dictionary properties)
+        throws ConfigurationException
+    {
+        deleted(pid);
+        DirectoryWatcher watcher = new DirectoryWatcher(properties, context);
+        watchers.put(pid, watcher);
+        watcher.start();
+    }
+}
\ No newline at end of file
diff --git a/fileinstall/src/main/resources/META-INF/LICENSE b/fileinstall/src/main/resources/META-INF/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/fileinstall/src/main/resources/META-INF/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   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/fileinstall/src/main/resources/META-INF/NOTICE b/fileinstall/src/main/resources/META-INF/NOTICE
new file mode 100644
index 0000000..1a025ba
--- /dev/null
+++ b/fileinstall/src/main/resources/META-INF/NOTICE
@@ -0,0 +1,5 @@
+Apache Felix File Install
+Copyright 2008 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
