diff --git a/pom.xml b/pom.xml
index 54e9e06..fd44ff6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,6 +45,10 @@
         <url>http://svn.apache.org/viewvc/sling/tags/org.apache.sling.xss-1.0.0</url>
     </scm>
 
+    <properties>
+        <sling.java.version>6</sling.java.version>
+    </properties>
+
     <!-- ======================================================================= -->
     <!-- B U I L D                                                               -->
     <!-- ======================================================================= -->
@@ -281,6 +285,12 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-api-mockito</artifactId>
+            <version>1.5.5</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-simple</artifactId>
         </dependency>
diff --git a/src/main/java/org/apache/sling/xss/XSSFilter.java b/src/main/java/org/apache/sling/xss/XSSFilter.java
index 4f212c0..c907e8e 100644
--- a/src/main/java/org/apache/sling/xss/XSSFilter.java
+++ b/src/main/java/org/apache/sling/xss/XSSFilter.java
@@ -41,17 +41,6 @@
     boolean check(ProtectionContext context, String src);
 
     /**
-     * Indicates whether or not a given source string contains XSS policy violations.
-     *
-     * @param context context to use for checking
-     * @param src     source string
-     * @param policy  the name/path of the policy to use
-     * @return true if the source is violation-free
-     * @throws NullPointerException if context is <code>null</code>
-     */
-    boolean check(ProtectionContext context, String src, String policy);
-
-    /**
      * Prevents the given source string from containing XSS stuff.
      * <p/>
      * The default protection context is used for checking.
@@ -70,17 +59,4 @@
      * @throws NullPointerException if context is <code>null</code>
      */
     String filter(ProtectionContext context, String src);
-
-    /**
-     * Protects the given source string from containing XSS stuff.
-     * <p/>
-     * If the context is unknown or <code>null</code> the default context is used.
-     *
-     * @param context context to use for checking
-     * @param src     source string
-     * @param policy  the name/path of the policy to use
-     * @return string that does not contain XSS stuff
-     * @throws NullPointerException if context is <code>null</code>
-     */
-    String filter(ProtectionContext context, String src, String policy);
 }
diff --git a/src/main/java/org/apache/sling/xss/impl/LongValidationRule.java b/src/main/java/org/apache/sling/xss/impl/LongValidationRule.java
index 7d258d9..6a5dc6b 100644
--- a/src/main/java/org/apache/sling/xss/impl/LongValidationRule.java
+++ b/src/main/java/org/apache/sling/xss/impl/LongValidationRule.java
@@ -88,7 +88,7 @@
 
         // validate min and max
         try {
-            long i = Long.valueOf(canonical);
+            long i = Long.parseLong(canonical);
             if (i < minValue) {
                 throw new ValidationException( "Invalid number input must be between " + minValue + " and " + maxValue + ": context=" + context, "Invalid number input must be between " + minValue + " and " + maxValue + ": context=" + context + ", input=" + input, context );
             }
diff --git a/src/main/java/org/apache/sling/xss/impl/PolicyHandler.java b/src/main/java/org/apache/sling/xss/impl/PolicyHandler.java
index e8452be..b3cb4ff 100644
--- a/src/main/java/org/apache/sling/xss/impl/PolicyHandler.java
+++ b/src/main/java/org/apache/sling/xss/impl/PolicyHandler.java
@@ -19,63 +19,38 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-import org.apache.sling.api.resource.Resource;
-import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.owasp.validator.html.AntiSamy;
 import org.owasp.validator.html.Policy;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
- * Class that provides the capability of securing input provided as plain text for
- * HTML output.
+ * Class that provides the capability of securing input provided as plain text for HTML output.
  */
 public class PolicyHandler {
 
-    /**
-     * Logger
-     */
-    private static final Logger LOGGER = LoggerFactory.getLogger(PolicyHandler.class);
-
     private Policy policy;
-
     private AntiSamy antiSamy;
 
     /**
      * Try to load a policy from the given relative path.
      */
-    public PolicyHandler(final ResourceResolverFactory factory, final String policyPath) throws Exception {
-        final ResourceResolver resolver = factory.getAdministrativeResourceResolver(null);
+    public PolicyHandler(InputStream policyStream) throws Exception {
+        // fix for classloader issue with IBM JVM: see bug #31946
+        // (currently: http://bugs.day.com/bugzilla/show_bug.cgi?id=31946)
+        Thread currentThread = Thread.currentThread();
+        ClassLoader cl = currentThread.getContextClassLoader();
         try {
-            final Resource rsrc = resolver.getResource(policyPath);
-            if (rsrc == null) {
-                throw new IllegalArgumentException("Could not resolve '" + policyPath + " to a valid policy resource.");
-            }
-            LOGGER.debug("Loading policy from '{}'.", rsrc.getPath());
-
-            InputStream policyStream = null;
-            // fix for classloader issue with IBM JVM: see bug #31946
-            // (currently: http://bugs.day.com/bugzilla/show_bug.cgi?id=31946)
-            Thread currentThread = Thread.currentThread();
-            ClassLoader cl = currentThread.getContextClassLoader();
-            try {
-                currentThread.setContextClassLoader(this.getClass().getClassLoader());
-                policyStream = rsrc.adaptTo(InputStream.class);
-                this.policy = Policy.getInstance(policyStream);
-                this.antiSamy = new AntiSamy(this.policy);
-            } finally {
-                if (policyStream != null) {
-                    try {
-                        policyStream.close();
-                    } catch (final IOException ioe) {
-                        // ignored as we can't do anything about this (besides logging)
-                    }
-                }
-                currentThread.setContextClassLoader(cl);
-            }
+            currentThread.setContextClassLoader(this.getClass().getClassLoader());
+            this.policy = Policy.getInstance(policyStream);
+            this.antiSamy = new AntiSamy(this.policy);
         } finally {
-            resolver.close();
+            if (policyStream != null) {
+                try {
+                    policyStream.close();
+                } catch (final IOException ioe) {
+                    // ignored as we can't do anything about this (besides logging)
+                }
+            }
+            currentThread.setContextClassLoader(cl);
         }
     }
 
diff --git a/src/main/java/org/apache/sling/xss/impl/XSSFilterImpl.java b/src/main/java/org/apache/sling/xss/impl/XSSFilterImpl.java
index a6dc82d..d7c6bb0 100644
--- a/src/main/java/org/apache/sling/xss/impl/XSSFilterImpl.java
+++ b/src/main/java/org/apache/sling/xss/impl/XSSFilterImpl.java
@@ -16,13 +16,10 @@
  ******************************************************************************/
 package org.apache.sling.xss.impl;
 
-import java.util.HashSet;
+import java.io.InputStream;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.sling.xss.ProtectionContext;
-import org.apache.sling.xss.XSSFilter;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Property;
@@ -30,92 +27,103 @@
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.SlingConstants;
 import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceResolverFactory;
+import org.apache.sling.xss.ProtectionContext;
+import org.apache.sling.xss.XSSFilter;
 import org.osgi.service.event.Event;
 import org.osgi.service.event.EventConstants;
 import org.osgi.service.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
- * This class implements the <code>XSSFilter</code> using the Antisamy
- * XSS protection library found at
+ * This class implements the <code>XSSFilter</code> using the Antisamy XSS protection library found at
  * <a href="http://code.google.com/p/owaspantisamy/">http://code.google.com/p/owaspantisamy/</a>.
  */
 @Component(immediate = true)
 @Service(value = {EventHandler.class, XSSFilter.class})
-@Property(name = EventConstants.EVENT_TOPIC, value = {"org/apache/sling/api/resource/Resource/*",
-        "org/apache/sling/api/resource/ResourceProvider/*"})
+@Property(name = EventConstants.EVENT_TOPIC, value = {"org/apache/sling/api/resource/Resource/*"})
 public class XSSFilterImpl implements XSSFilter, EventHandler {
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(XSSFilterImpl.class);
+
+    private static final String DEFAULT_POLICY_PATH = "sling/xss/config.xml";
+    private static final int DEFAULT_POLICY_CACHE_SIZE = 128;
+    private PolicyHandler defaultHandler;
+
+    // available contexts
+    private final XSSFilterRule htmlHtmlContext = new HtmlToHtmlContentContext();
+    private final XSSFilterRule plainHtmlContext = new PlainTextToHtmlContentContext();
+
+    // policies cache
+    private Map<String, PolicyHandler> policies = new ConcurrentHashMap<String, PolicyHandler>();
+
     @Reference
     private ResourceResolverFactory resourceResolverFactory = null;
 
-    /**
-     * available contexts
-     */
-    private final XSSFilterRule htmlHtmlContext = new HtmlToHtmlContentContext();
-
-    private final XSSFilterRule plainHtmlContext = new PlainTextToHtmlContentContext();
-
-    /**
-     * The paths to check for changes.
-     */
-    private Set<String> checkPaths = new HashSet<String>();
-
-    /**
-     * A cache for the policies.
-     */
-    private Map<String, PolicyHandler> policies = new ConcurrentHashMap<String, PolicyHandler>();
-
-    /**
-     * Maximum size for policy cache.
-     */
-    private static final int DEFAULT_POLICY_CACHE_SIZE = 128;
-
-    private void updateCheckPaths(final String policyPath) {
-        final Set<String> newCheckPaths = new HashSet<String>(checkPaths);
-        ResourceResolver resolver = null;
-        try {
-            resolver = this.resourceResolverFactory.getAdministrativeResourceResolver(null);
-            for (final String path : resolver.getSearchPath()) {
-                newCheckPaths.add(path + policyPath);
-                newCheckPaths.add(path + policyPath + "/jcr:content");
-            }
-            this.checkPaths = newCheckPaths;
-        } catch (final LoginException le) {
-            throw new RuntimeException("Unable to get administrative login.", le);
-        } finally {
-            if (resolver != null) {
-                resolver.close();
-            }
+    @Override
+    public void handleEvent(final Event event) {
+        final String path = (String) event.getProperty(SlingConstants.PROPERTY_PATH);
+        if (path.endsWith("/" + DEFAULT_POLICY_PATH)) {
+            updateDefaultHandler();
         }
     }
 
+    @Override
+    public boolean check(final ProtectionContext context, final String src) {
+        return this.check(context, src, null);
+    }
+
+    @Override
+    public String filter(final String src) {
+        return this.filter(XSSFilter.DEFAULT_CONTEXT, src);
+    }
+
+    @Override
+    public String filter(final ProtectionContext context, final String src) {
+        return this.filter(context, src, null);
+    }
+
     @Activate
     @SuppressWarnings("unused")
     protected void activate() {
         // load default handler
-        this.getPolicyHandler(null);
+        updateDefaultHandler();
     }
 
-
-    /**
-     * @see org.osgi.service.event.EventHandler#handleEvent(org.osgi.service.event.Event)
-     */
-    public void handleEvent(final Event event) {
-        final String path = (String) event.getProperty(SlingConstants.PROPERTY_PATH);
-        boolean reload = false;
-        for (final String checkPath : this.checkPaths) {
-            if (path.equals(checkPath)) {
-                reload = true;
-                break;
+    private void updateDefaultHandler() {
+        ResourceResolver adminResolver = null;
+        try {
+            adminResolver = resourceResolverFactory.getAdministrativeResourceResolver(null);
+            Resource policyResource = adminResolver.getResource(DEFAULT_POLICY_PATH);
+            if (policyResource != null) {
+                InputStream policyStream = policyResource.adaptTo(InputStream.class);
+                if (policyStream != null) {
+                    try {
+                        if (defaultHandler == null) {
+                            defaultHandler = new PolicyHandler(policyStream);
+                            policyStream.close();
+                        }
+                    } catch (Exception e) {
+                        LOGGER.error("Unable to load policy from " + policyResource.getPath(), e);
+                    }
+                }
+            }
+            if (defaultHandler == null) {
+                throw new IllegalStateException("Cannot load a default policy handler.");
+            }
+        } catch (LoginException e) {
+            LOGGER.error("Unable to load the default policy file.", e);
+        } finally {
+            if (adminResolver != null) {
+                adminResolver.close();
             }
         }
-        if (reload) {
-            this.policies.clear();
-        }
     }
 
+
     /**
      * Get the filter rule context.
      */
@@ -129,67 +137,56 @@
         return this.plainHtmlContext;
     }
 
-    /**
-     * Get the policy handler.
+    /*
+        The following methods are not part of the API. Client-code dependency to these methods is risky as they can be removed at any
+        point in time from the implementation.
      */
-    private PolicyHandler getPolicyHandler(final String policyPath) {
-        final String policyName = (policyPath == null ? XSSFilterRule.DEFAULT_POLICY_PATH : policyPath);
-        PolicyHandler handler = this.policies.get(policyName);
-        if (handler == null) {
-            synchronized (this) {
-                try {
-                    handler = new PolicyHandler(this.resourceResolverFactory, policyName);
-                    if (this.policies.size() < DEFAULT_POLICY_CACHE_SIZE) {
-                        this.policies.put(policyName, handler);
-                        this.updateCheckPaths(policyName);
-                    }
-                } catch (final Exception e) {
-                    throw new RuntimeException("Unable to load policy " + policyName, e);
-                }
-            }
-        }
-        return handler;
-    }
 
-    /**
-     * @see org.apache.sling.xss.XSSFilter#check(org.apache.sling.xss.ProtectionContext, String)
-     */
-    public boolean check(final ProtectionContext context, final String src) {
-        return this.check(context, src, null);
-    }
-
-    /**
-     * @see org.apache.sling.xss.XSSFilter#check(org.apache.sling.xss.ProtectionContext, String, String)
-     */
     public boolean check(final ProtectionContext context, final String src, final String policy) {
         final XSSFilterRule ctx = this.getFilterRule(context);
-        final PolicyHandler handler = ctx.supportsPolicy() ? this.getPolicyHandler(policy) : null;
+        PolicyHandler handler = null;
+        if (ctx.supportsPolicy()) {
+            if (policy == null || (handler = policies.get(policy)) == null) {
+                handler = defaultHandler;
+            }
+        }
         return ctx.check(handler, src);
     }
 
-    /**
-     * @see org.apache.sling.xss.XSSFilter#filter(java.lang.String)
-     */
-    public String filter(final String src) {
-        return this.filter(XSSFilter.DEFAULT_CONTEXT, src);
-    }
-
-    /**
-     * @see org.apache.sling.xss.XSSFilter#filter(ProtectionContext, java.lang.String)
-     */
-    public String filter(final ProtectionContext context, final String src) {
-        return this.filter(context, src, null);
-    }
-
-    /**
-     * @see org.apache.sling.xss.XSSFilter#filter(ProtectionContext, java.lang.String, java.lang.String)
-     */
     public String filter(final ProtectionContext context, final String src, final String policy) {
         if (src == null) {
             return "";
         }
         final XSSFilterRule ctx = this.getFilterRule(context);
-        final PolicyHandler handler = ctx.supportsPolicy() ? this.getPolicyHandler(policy) : null;
+        PolicyHandler handler = null;
+        if (ctx.supportsPolicy()) {
+            if (policy == null || (handler = policies.get(policy)) == null) {
+                handler = defaultHandler;
+            }
+        }
         return ctx.filter(handler, src);
     }
+
+    public void setDefaultPolicy(InputStream policyStream) throws Exception {
+        defaultHandler = new PolicyHandler(policyStream);
+    }
+
+    public void resetDefaultPolicy() {
+        updateDefaultHandler();
+    }
+
+    public void loadPolicy(String policyName, InputStream policyStream) throws Exception {
+        if (policies.size() < DEFAULT_POLICY_CACHE_SIZE) {
+            PolicyHandler policyHandler = new PolicyHandler(policyStream);
+            policies.put(policyName, policyHandler);
+        }
+    }
+
+    public void unloadPolicy(String policyName) {
+        policies.remove(policyName);
+    }
+
+    public boolean hasPolicy(String policyName) {
+        return policies.containsKey(policyName);
+    }
 }
diff --git a/src/main/java/org/apache/sling/xss/impl/XSSFilterRule.java b/src/main/java/org/apache/sling/xss/impl/XSSFilterRule.java
index e5a642b..8e61951 100644
--- a/src/main/java/org/apache/sling/xss/impl/XSSFilterRule.java
+++ b/src/main/java/org/apache/sling/xss/impl/XSSFilterRule.java
@@ -22,11 +22,6 @@
 public interface XSSFilterRule {
 
     /**
-     * Path to default policy
-     */
-    String DEFAULT_POLICY_PATH = "sling/xss/config.xml";
-
-    /**
      * Check to see if a given string contains policy violations.
      *
      * @param policyHandler the policy handler to use for filtering
diff --git a/src/test/java/org/apache/sling/xss/impl/XSSAPIImplTest.java b/src/test/java/org/apache/sling/xss/impl/XSSAPIImplTest.java
index 0bda966..f1347ec 100644
--- a/src/test/java/org/apache/sling/xss/impl/XSSAPIImplTest.java
+++ b/src/test/java/org/apache/sling/xss/impl/XSSAPIImplTest.java
@@ -16,28 +16,27 @@
  ******************************************************************************/
 package org.apache.sling.xss.impl;
 
-import static org.junit.Assert.fail;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 import java.io.FileInputStream;
 import java.io.InputStream;
 import java.lang.reflect.Field;
-import java.util.Map;
 
-import junit.framework.TestCase;
-
-import org.apache.sling.xss.XSSAPI;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.xss.XSSAPI;
 import org.junit.Before;
 import org.junit.Test;
-import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.owasp.validator.html.AntiSamy;
 import org.owasp.validator.html.Policy;
+import org.powermock.reflect.Whitebox;
+
+import junit.framework.TestCase;
+
+import static org.junit.Assert.fail;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 public class XSSAPIImplTest {
 
@@ -46,27 +45,25 @@
     private XSSAPI xssAPI;
 
     @Before
-    public void Setup() {
+    public void setup() {
         try {
             InputStream policyStream = new FileInputStream("./src/main/resources/SLING-INF/content/config.xml");
             Policy policy = Policy.getInstance(policyStream);
             AntiSamy antiSamy = new AntiSamy(policy);
 
-            PolicyHandler mockPolicyHandler = mock(PolicyHandler.class, Mockito.RETURNS_DEEP_STUBS);
+            PolicyHandler mockPolicyHandler = mock(PolicyHandler.class);
             when(mockPolicyHandler.getPolicy()).thenReturn(policy);
             when(mockPolicyHandler.getAntiSamy()).thenReturn(antiSamy);
 
             XSSFilterImpl xssFilter = new XSSFilterImpl();
-            Field policiesField = XSSFilterImpl.class.getDeclaredField("policies");
-            policiesField.setAccessible(true);
-            ((Map<String, PolicyHandler>) policiesField.get(xssFilter)).put(XSSFilterRule.DEFAULT_POLICY_PATH, mockPolicyHandler);
+            Whitebox.setInternalState(xssFilter, "defaultHandler", mockPolicyHandler);
 
             xssAPI = new XSSAPIImpl();
             Field filterField = XSSAPIImpl.class.getDeclaredField("xssFilter");
             filterField.setAccessible(true);
             filterField.set(xssAPI, xssFilter);
 
-            ResourceResolver mockResolver = mock(ResourceResolver.class, Mockito.RETURNS_DEEP_STUBS);
+            ResourceResolver mockResolver = mock(ResourceResolver.class);
             when(mockResolver.map(anyString())).thenAnswer(new Answer() {
                 public Object answer(InvocationOnMock invocation) {
                     Object[] args = invocation.getArguments();
@@ -75,7 +72,7 @@
                 }
             });
 
-            SlingHttpServletRequest mockRequest = mock(SlingHttpServletRequest.class, Mockito.RETURNS_DEEP_STUBS);
+            SlingHttpServletRequest mockRequest = mock(SlingHttpServletRequest.class);
             when(mockRequest.getResourceResolver()).thenReturn(mockResolver);
 
             xssAPI = xssAPI.getRequestSpecificAPI(mockRequest);
@@ -85,7 +82,7 @@
     }
 
     @Test
-    public void TestEncodeForHTML() {
+    public void testEncodeForHTML() {
         String[][] testData = {
                 //         Source                            Expected Result
                 //
@@ -108,7 +105,7 @@
     }
 
     @Test
-    public void TestEncodeForHTMLAttr() {
+    public void testEncodeForHTMLAttr() {
         String[][] testData = {
                 //         Source                            Expected Result
                 //
@@ -130,7 +127,7 @@
     }
 
     @Test
-    public void TestEncodeForXML() {
+    public void testEncodeForXML() {
         String[][] testData = {
                 //         Source                            Expected Result
                 //
@@ -152,7 +149,7 @@
     }
 
     @Test
-    public void TestEncodeForXMLAttr() {
+    public void testEncodeForXMLAttr() {
         String[][] testData = {
                 //         Source                            Expected Result
                 //
@@ -175,7 +172,7 @@
     }
 
     @Test
-    public void TestFilterHTML() {
+    public void testFilterHTML() {
         String[][] testData = {
                 //         Source                            Expected Result
                 {null, ""},
@@ -210,7 +207,7 @@
     }
 
     @Test
-    public void TestGetValidHref() {
+    public void testGetValidHref() {
         String[][] testData = {
                 //         Href                                        Expected Result
                 //
@@ -266,7 +263,7 @@
     }
 
     @Test
-    public void TestGetValidInteger() {
+    public void testGetValidInteger() {
         String[][] testData = {
                 //         Source                                        Expected Result
                 //
@@ -289,7 +286,7 @@
     }
 
     @Test
-    public void TestGetValidLong() {
+    public void testGetValidLong() {
         String[][] testData = {
                 //         Source                                        Expected Result
                 //
@@ -312,7 +309,7 @@
     }
 
     @Test
-    public void TestGetValidDimension() {
+    public void testGetValidDimension() {
         String[][] testData = {
                 //         Source                                        Expected Result
                 //
@@ -342,7 +339,7 @@
     }
 
     @Test
-    public void TestEncodeForJSString() {
+    public void testEncodeForJSString() {
         String[][] testData = {
                 //         Source                            Expected Result
                 //
@@ -364,7 +361,7 @@
     }
 
     @Test
-    public void TestGetValidJSToken() {
+    public void testGetValidJSToken() {
         String[][] testData = {
                 //         Source                            Expected Result
                 //
@@ -396,7 +393,7 @@
     }
 
     @Test
-    public void TestEncodeForCSSString() {
+    public void testEncodeForCSSString() {
         String[][] testData = {
                 // Source   Expected result
                 {null, null},
@@ -416,7 +413,7 @@
     }
 
     @Test
-    public void TestGetValidStyleToken() {
+    public void testGetValidStyleToken() {
         String[][] testData = {
                 // Source                           Expected result
                 {null                               , RUBBISH},
@@ -488,7 +485,7 @@
     }
 
     @Test
-    public void TestGetValidCSSColor() {
+    public void testGetValidCSSColor() {
         String[][] testData = {
                 //      Source                          Expected Result
                 //
@@ -524,7 +521,7 @@
     }
 
     @Test
-    public void TestGetValidMultiLineComment() {
+    public void testGetValidMultiLineComment() {
         String[][] testData = {
                 //Source            Expected Result
 
