Index: resteasy-jaxrs/src/main/java/org/jboss/resteasy/specimpl/PathSegmentImpl.java
===================================================================
--- resteasy-jaxrs/src/main/java/org/jboss/resteasy/specimpl/PathSegmentImpl.java	(revision 1275)
+++ resteasy-jaxrs/src/main/java/org/jboss/resteasy/specimpl/PathSegmentImpl.java	(working copy)
@@ -38,7 +38,7 @@
                String value = "";
                if (namevalue.length > 1)
                {
-                  value = namevalue[1];
+                  value = namevalue[1].replace("%3B",";");
                }
                matrixParameters.add(name, value);
             }
Index: resteasy-jaxrs/src/main/java/org/jboss/resteasy/specimpl/UriInfoImpl.java
===================================================================
--- resteasy-jaxrs/src/main/java/org/jboss/resteasy/specimpl/UriInfoImpl.java	(revision 1275)
+++ resteasy-jaxrs/src/main/java/org/jboss/resteasy/specimpl/UriInfoImpl.java	(working copy)
@@ -35,7 +35,8 @@
    private List<String> encodedMatchedUris;
    private List<Object> ancestors;
 
-
+   private static final String ESCAPED_SEMICOLON_REPLACEMENT = "&&$$^^";
+   
    public UriInfoImpl(URI absolutePath, URI baseUri, String encodedPath, String queryString, List<PathSegment> encodedPathSegments)
    {
       /*
@@ -69,7 +70,7 @@
       {
          try
          {
-            pathSegments.add(new PathSegmentImpl(URLDecoder.decode(((PathSegmentImpl) segment).getOriginal(), "UTF-8")));
+            pathSegments.add(new PathSegmentImpl(URLDecoder.decode(((PathSegmentImpl) segment).getOriginal().replace("%3B", ESCAPED_SEMICOLON_REPLACEMENT), "UTF-8").replace(ESCAPED_SEMICOLON_REPLACEMENT, "%3B")));
          }
          catch (UnsupportedEncodingException e)
          {
Index: resteasy-jaxrs/src/main/java/org/jboss/resteasy/plugins/server/tjws/PatchedHttpServletRequest.java
===================================================================
--- resteasy-jaxrs/src/main/java/org/jboss/resteasy/plugins/server/tjws/PatchedHttpServletRequest.java	(revision 1275)
+++ resteasy-jaxrs/src/main/java/org/jboss/resteasy/plugins/server/tjws/PatchedHttpServletRequest.java	(working copy)
@@ -59,7 +59,7 @@
       if (url.getHost() != null) buffer.append(url.getHost());
       if (url.getPort() != -1 && url.getPort() != 80) buffer.append(":").append(Integer.toString(url.getPort()));
       if (url.getPath() != null)
-         buffer.append(Encode.encodePath(url.getPath(), false).replace("%3B", ";").replace("%3D", "="));
+         buffer.append(Encode.encodePath(url.getPath(), false).replace("%3D", "="));
       if (url.getQuery() != null) buffer.append("?").append(url.getQuery());
       if (url.getRef() != null) buffer.append("#").append(Encode.encodeSegment(url.getRef(), false));
       String buf = buffer.toString();
Index: resteasy-jaxrs/src/test/java/org/jboss/resteasy/test/finegrain/resource/UriInfoTest.java
===================================================================
--- resteasy-jaxrs/src/test/java/org/jboss/resteasy/test/finegrain/resource/UriInfoTest.java	(revision 1275)
+++ resteasy-jaxrs/src/test/java/org/jboss/resteasy/test/finegrain/resource/UriInfoTest.java	(working copy)
@@ -1,28 +1,32 @@
 package org.jboss.resteasy.test.finegrain.resource;
 
+import static org.jboss.resteasy.test.TestPortProvider.createGetMethod;
+import static org.jboss.resteasy.test.TestPortProvider.createURI;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.List;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.MatrixParam;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.PathSegment;
+import javax.ws.rs.core.UriInfo;
+
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.methods.GetMethod;
 import org.jboss.resteasy.core.Dispatcher;
 import org.jboss.resteasy.plugins.server.resourcefactory.SingletonResource;
 import org.jboss.resteasy.test.EmbeddedContainer;
-import static org.jboss.resteasy.test.TestPortProvider.*;
 import org.jboss.resteasy.util.HttpResponseCodes;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.PathSegment;
-import javax.ws.rs.core.UriInfo;
-import java.io.IOException;
-import java.net.URI;
-import java.util.List;
-
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
  * @version $Revision: 1 $
@@ -225,4 +229,25 @@
          EmbeddedContainer.stop();
       }
    }
+   
+   @Path("/queryEscapedMatrParam")
+   public static class EscapedMatrParamResource {
+      @GET
+      public String doGet(@MatrixParam("a")String param) {
+         Assert.assertEquals("a;b", param);
+         return "content";
+      }
+   }
+
+   @Test
+   public void testEscapedMatrParam() throws Exception {
+      dispatcher = EmbeddedContainer.start().getDispatcher();
+      try {
+         dispatcher.getRegistry().addPerRequestResource(EscapedMatrParamResource.class);
+         _test(new HttpClient(), "/queryEscapedMatrParam;a=a%253Bb");
+      } finally {
+         EmbeddedContainer.stop();
+      }
+   }
+   
 }
