diff --git a/velocity-tools-2.0-dont_copy_test_lib.patch b/velocity-tools-2.0-dont_copy_test_lib.patch
new file mode 100644
index 0000000..4580c5b
--- /dev/null
+++ b/velocity-tools-2.0-dont_copy_test_lib.patch
@@ -0,0 +1,38 @@
+diff -Nru velocity-tools-2.0-src/download.xml velocity-tools-2.0-src-gil/download.xml
+--- velocity-tools-2.0-src/download.xml 2008-11-30 17:51:06.000000000 +0100
++++ velocity-tools-2.0-src-gil/download.xml 2011-09-10 15:26:35.088480329 +0200
+@@ -352,8 +352,6 @@
+
+
+
+-
+-
+
+
+
+diff -Nru velocity-tools-2.0-src/examples.xml velocity-tools-2.0-src-gil/examples.xml
+--- velocity-tools-2.0-src/examples.xml 2008-11-17 21:11:23.000000000 +0100
++++ velocity-tools-2.0-src-gil/examples.xml 2011-09-10 15:26:35.089480329 +0200
+@@ -53,13 +53,6 @@
+
+
+
+-
+-
+-
+-
+-
+-
+-
+
+
+
+@@ -69,8 +62,6 @@
+
+
+
+-
+-
+
+
+
diff --git a/velocity-tools-2.0-junit4.patch b/velocity-tools-2.0-junit4.patch
new file mode 100644
index 0000000..f7d1fb0
--- /dev/null
+++ b/velocity-tools-2.0-junit4.patch
@@ -0,0 +1,241 @@
+diff -Nru velocity-tools-2.0-src/src/test/java/org/apache/velocity/tools/generic/DisplayToolTests.java velocity-tools-2.0-src-gil/src/test/java/org/apache/velocity/tools/generic/DisplayToolTests.java
+--- velocity-tools-2.0-src/src/test/java/org/apache/velocity/tools/generic/DisplayToolTests.java 2009-05-12 00:24:52.000000000 +0200
++++ velocity-tools-2.0-src-gil/src/test/java/org/apache/velocity/tools/generic/DisplayToolTests.java 2011-09-10 15:29:12.534469474 +0200
+@@ -119,11 +119,11 @@
+ display.configure(conf);
+ assertEquals(";", display.getListDelimiter());
+ assertEquals(" und ", display.getListFinalDelimiter());
+- assertEquals(5, display.getTruncateLength());
++ assertEquals((double)5, display.getTruncateLength());
+ assertEquals(">", display.getTruncateSuffix());
+ assertEquals(true, display.getTruncateAtWord());
+ assertEquals("~", display.getCellSuffix());
+- assertEquals(4, display.getCellLength());
++ assertEquals((double)4, display.getCellLength());
+ assertEquals("n/a", display.getDefaultAlternate());
+ String[] tags = display.getAllowedTags();
+ assertNotNull(tags);
+@@ -142,14 +142,14 @@
+ assertNull(display.measure(null));
+ DisplayTool.Measurements dims = display.measure("");
+ assertNotNull(dims);
+- assertEquals(1, dims.getHeight());
+- assertEquals(0, dims.getWidth());
++ assertEquals((double)1, dims.getHeight());
++ assertEquals((double)0, dims.getWidth());
+ dims = display.measure("twelve chars");
+- assertEquals(12, dims.getWidth());
+- assertEquals(1, dims.getHeight());
++ assertEquals((double)12, dims.getWidth());
++ assertEquals((double)1, dims.getHeight());
+ dims = display.measure("one\ntwo\nthree");
+- assertEquals(5, dims.getWidth());
+- assertEquals(3, dims.getHeight());
++ assertEquals((double)5, dims.getWidth());
++ assertEquals((double)3, dims.getHeight());
+ }
+
+ public @Test void methodMessage_StringObjectVarArgs() throws Exception
+@@ -242,7 +242,7 @@
+ {
+ DisplayTool display = new DisplayTool();
+ display.setCellLength(10);
+- assertEquals(10, display.getCellLength());
++ assertEquals((double)10, display.getCellLength());
+ }
+
+ public @Test void methodSetCellSuffix_String() throws Exception
+@@ -277,7 +277,7 @@
+ {
+ DisplayTool display = new DisplayTool();
+ display.setTruncateLength(5);
+- assertEquals(5, display.getTruncateLength());
++ assertEquals((double)5, display.getTruncateLength());
+ }
+
+ public @Test void methodSetTruncateSuffix_String() throws Exception
+@@ -457,4 +457,4 @@
+ }
+ }
+
+-}
+\ Manca newline alla fine del file
++}
+diff -Nru velocity-tools-2.0-src/src/test/java/org/apache/velocity/tools/generic/LinkToolTests.java velocity-tools-2.0-src-gil/src/test/java/org/apache/velocity/tools/generic/LinkToolTests.java
+--- velocity-tools-2.0-src/src/test/java/org/apache/velocity/tools/generic/LinkToolTests.java 2009-05-12 00:24:52.000000000 +0200
++++ velocity-tools-2.0-src-gil/src/test/java/org/apache/velocity/tools/generic/LinkToolTests.java 2011-09-10 15:29:12.535469474 +0200
+@@ -248,7 +248,7 @@
+ LinkTool link = newInstance();
+ assertNull(link.getPort());
+ link = newInstance(LinkTool.PORT_KEY, 42);
+- assertEquals(42, link.getPort());
++ assertEquals(new Integer(42), link.getPort());
+ }
+
+ public @Test void methodPort_Object() throws Exception
+@@ -256,15 +256,15 @@
+ LinkTool link = newInstance();
+ assertNull(link.port(null).getPort());
+ assertNull(link.port(":asd").getPort());
+- assertEquals(1, link.port(1).getPort());
+- assertEquals(42, link.port("42").getPort());
++ assertEquals(new Integer(1), link.port(1).getPort());
++ assertEquals(new Integer(42), link.port("42").getPort());
+ }
+
+ public @Test void methodSetPort_Object() throws Exception
+ {
+ LinkTool link = newInstance();
+ link.setPort(42);
+- assertEquals(42, link.getPort());
++ assertEquals(new Integer(42), link.getPort());
+ }
+
+ public @Test void methodGetPath() throws Exception
+@@ -845,4 +845,4 @@
+ }
+
+ }
+-
+\ Manca newline alla fine del file
++
+diff -Nru velocity-tools-2.0-src/src/test/java/org/apache/velocity/tools/generic/LoopToolTests.java velocity-tools-2.0-src-gil/src/test/java/org/apache/velocity/tools/generic/LoopToolTests.java
+--- velocity-tools-2.0-src/src/test/java/org/apache/velocity/tools/generic/LoopToolTests.java 2009-05-12 00:24:52.000000000 +0200
++++ velocity-tools-2.0-src-gil/src/test/java/org/apache/velocity/tools/generic/LoopToolTests.java 2011-09-10 15:29:12.536469474 +0200
+@@ -323,45 +323,45 @@
+ {
+ LoopTool loop = new LoopTool();
+ Iterator i = loop.watch(ARRAY);
+- assertEquals(0, loop.getCount());
++ assertEquals(new Integer(0), loop.getCount());
+ assertNull(loop.getIndex());
+ i.next();
+- assertEquals(1, loop.getCount());
+- assertEquals(0, loop.getIndex());
++ assertEquals(new Integer(1), loop.getCount());
++ assertEquals(new Integer(0), loop.getIndex());
+ i.next();
+- assertEquals(2, loop.getCount());
+- assertEquals(1, loop.getIndex());
++ assertEquals(new Integer(2), loop.getCount());
++ assertEquals(new Integer(1), loop.getIndex());
+ i.next();
+- assertEquals(3, loop.getCount());
+- assertEquals(2, loop.getIndex());
++ assertEquals(new Integer(3), loop.getCount());
++ assertEquals(new Integer(2), loop.getIndex());
+ loop.pop();
+ // test that skipped iterations are still included
+ i = loop.watch(ARRAY);
+ loop.skip(2);
+- assertEquals(2, loop.getCount());
+- assertEquals(1, loop.getIndex());
++ assertEquals(new Integer(2), loop.getCount());
++ assertEquals(new Integer(1), loop.getIndex());
+ }
+
+ public @Test void methodGetCountOrGetIndex_String() throws Exception
+ {
+ LoopTool loop = new LoopTool();
+ Iterator i = loop.watch(ARRAY, "i");
+- assertEquals(0, loop.getCount("i"));
++ assertEquals(new Integer(0), loop.getCount("i"));
+ assertNull(loop.getIndex("i"));
+ i.next();
+- assertEquals(1, loop.getCount("i"));
+- assertEquals(0, loop.getIndex("i"));
++ assertEquals(new Integer(1), loop.getCount("i"));
++ assertEquals(new Integer(0), loop.getIndex("i"));
+ Iterator j = loop.watch(ARRAY, "j");
+ loop.skip(2);
+- assertEquals(2, loop.getCount("j"));
+- assertEquals(1, loop.getIndex("j"));
+- assertEquals(1, loop.getCount("i"));
+- assertEquals(0, loop.getIndex("i"));
++ assertEquals(new Integer(2), loop.getCount("j"));
++ assertEquals(new Integer(1), loop.getIndex("j"));
++ assertEquals(new Integer(1), loop.getCount("i"));
++ assertEquals(new Integer(0), loop.getIndex("i"));
+ // check short syntax too
+- assertEquals(2, loop.get("count_j"));
+- assertEquals(1, loop.get("index_j"));
+- assertEquals(1, loop.get("count_i"));
+- assertEquals(0, loop.get("index_i"));
++ assertEquals(new Integer(2), loop.get("count_j"));
++ assertEquals(new Integer(1), loop.get("index_j"));
++ assertEquals(new Integer(1), loop.get("count_i"));
++ assertEquals(new Integer(0), loop.get("index_i"));
+ }
+
+ public @Test void aliasMethods() throws Exception
+@@ -403,15 +403,15 @@
+ public @Test void method_getDepth() throws Exception
+ {
+ LoopTool loop = new LoopTool();
+- assertEquals(0, loop.getDepth());
++ assertEquals((double)0, loop.getDepth());
+ loop.watch(ARRAY);
+- assertEquals(1, loop.getDepth());
++ assertEquals((double)1, loop.getDepth());
+ loop.watch(ARRAY);
+- assertEquals(2, loop.getDepth());
++ assertEquals((double)2, loop.getDepth());
+ loop.pop();
+- assertEquals(1, loop.getDepth());
++ assertEquals((double)1, loop.getDepth());
+ loop.pop();
+- assertEquals(0, loop.getDepth());
++ assertEquals((double)0, loop.getDepth());
+ }
+
+ }
+diff -Nru velocity-tools-2.0-src/src/test/java/org/apache/velocity/tools/test/whitebox/GenericToolsTests.java velocity-tools-2.0-src-gil/src/test/java/org/apache/velocity/tools/test/whitebox/GenericToolsTests.java
+--- velocity-tools-2.0-src/src/test/java/org/apache/velocity/tools/test/whitebox/GenericToolsTests.java 2008-12-02 17:45:13.000000000 +0100
++++ velocity-tools-2.0-src-gil/src/test/java/org/apache/velocity/tools/test/whitebox/GenericToolsTests.java 2011-09-10 15:29:12.533469474 +0200
+@@ -78,9 +78,9 @@
+ assertEquals(disp,dateTool.format(date));
+ assertEquals(disp2,dateTool.format("yyyy/MM/dd",date));
+ /* test parsing */
+- assertEquals(2007,dateTool.getYear(disp));
+- assertEquals(0,dateTool.getMonth(disp));
+- assertEquals(2,dateTool.getDay(disp));
++ assertEquals(new Integer(2007), dateTool.getYear(disp));
++ assertEquals(new Integer(0), dateTool.getMonth(disp));
++ assertEquals(new Integer(2), dateTool.getDay(disp));
+ }
+
+ public @Test void testEscapeTool() {
+@@ -147,24 +147,24 @@
+ assertNotNull(mathTool);
+ assertEquals(1,mathTool.abs(-1));
+ assertEquals(2,mathTool.add(1,1));
+- assertEquals(3,mathTool.ceil(2.5));
++ assertEquals(new Integer(3),mathTool.ceil(2.5));
+ assertEquals(4,mathTool.div(8,2));
+- assertEquals(5,mathTool.floor(5.1));
++ assertEquals(new Integer(5),mathTool.floor(5.1));
+ assertEquals(6,mathTool.getAverage(new long[] {5,6,7}));
+ /* getTotal() watches the type of its first argument, so assertEquals needs a long */
+ assertEquals((long)7,mathTool.getTotal(new long[] {2,2,3}));
+- assertEquals(8,mathTool.idiv(130,16));
++ assertEquals(new Integer(8),mathTool.idiv(130,16));
+ assertEquals(9,mathTool.max(9,-10));
+ assertEquals(10,mathTool.min(10,20));
+- assertEquals(11,mathTool.mod(37,13));
++ assertEquals(new Integer(11),mathTool.mod(37,13));
+ assertEquals(12,mathTool.mul(3,4));
+- assertEquals(13,mathTool.round(12.8));
+- assertEquals(14.2,mathTool.roundTo(1,14.18));
+- assertEquals(-5.0,mathTool.roundTo(2,-4.999));
++ assertEquals(new Integer(13),mathTool.round(12.8));
++ assertEquals(new Double(14.2),mathTool.roundTo(1,14.18));
++ assertEquals(new Double(-5.0),mathTool.roundTo(2,-4.999));
+ assertEquals(15,mathTool.sub(30,15));
+ assertEquals(16,mathTool.pow(4,2));
+- assertEquals(17,mathTool.toInteger("17"));
+- assertEquals(18.1,mathTool.toDouble("18.1"));
++ assertEquals(new Integer(17),mathTool.toInteger("17"));
++ assertEquals(new Double(18.1),mathTool.toDouble("18.1"));
+ }
+
+ public @Test void testNumberTool() {
diff --git a/velocity-tools-2.0-port-to-dom4j-2.0.patch b/velocity-tools-2.0-port-to-dom4j-2.0.patch
new file mode 100644
index 0000000..ceff2ae
--- /dev/null
+++ b/velocity-tools-2.0-port-to-dom4j-2.0.patch
@@ -0,0 +1,24 @@
+From 453940a997ef72f389a55de3e9a3c8f8428ae3d6 Mon Sep 17 00:00:00 2001
+Date: Fri, 31 Mar 2017 13:00:10 +0200
+Subject: [PATCH] Port to dom4j 2.0
+
+---
+ src/main/java/org/apache/velocity/tools/generic/XmlTool.java | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/main/java/org/apache/velocity/tools/generic/XmlTool.java b/src/main/java/org/apache/velocity/tools/generic/XmlTool.java
+index 4ab748c..3d5feab 100644
+--- a/src/main/java/org/apache/velocity/tools/generic/XmlTool.java
++++ b/src/main/java/org/apache/velocity/tools/generic/XmlTool.java
+@@ -572,7 +572,7 @@ public class XmlTool extends SafeConfig
+ {
+ if (n instanceof Element)
+ {
+- kids.addAll((List)((Element)n).elements());
++ kids.addAll(((Element)n).elements());
+ }
+ }
+ return new XmlTool(kids);
+--
+2.9.3
+
diff --git a/velocity-tools-2.0-servlet.patch b/velocity-tools-2.0-servlet.patch
new file mode 100644
index 0000000..5bc83dc
--- /dev/null
+++ b/velocity-tools-2.0-servlet.patch
@@ -0,0 +1,38 @@
+diff -Nru velocity-tools-2.0-src/src/main/java/org/apache/velocity/tools/view/ImportSupport.java velocity-tools-2.0-src.servlet/src/main/java/org/apache/velocity/tools/view/ImportSupport.java
+--- velocity-tools-2.0-src/src/main/java/org/apache/velocity/tools/view/ImportSupport.java 2007-12-12 18:04:38.000000000 +0100
++++ velocity-tools-2.0-src.servlet/src/main/java/org/apache/velocity/tools/view/ImportSupport.java 2015-06-19 15:50:41.054584752 +0200
+@@ -36,6 +36,7 @@
+ import javax.servlet.RequestDispatcher;
+ import javax.servlet.ServletContext;
+ import javax.servlet.ServletOutputStream;
++import javax.servlet.WriteListener;
+ import javax.servlet.http.HttpServletRequest;
+ import javax.servlet.http.HttpServletResponse;
+ import javax.servlet.http.HttpServletResponseWrapper;
+@@ -510,6 +511,14 @@
+ {
+ bos.write(b);
+ }
++
++ public void setWriteListener(WriteListener listener) {
++ throw new UnsupportedOperationException("Not implemented yet.");
++ }
++
++ public boolean isReady() {
++ return false;
++ }
+ };
+ return sos;
+ }
+diff -Nru velocity-tools-2.0-src/src/main/java/org/apache/velocity/tools/view/ParameterTool.java velocity-tools-2.0-src.servlet/src/main/java/org/apache/velocity/tools/view/ParameterTool.java
+--- velocity-tools-2.0-src/src/main/java/org/apache/velocity/tools/view/ParameterTool.java 2009-05-12 00:24:53.000000000 +0200
++++ velocity-tools-2.0-src.servlet/src/main/java/org/apache/velocity/tools/view/ParameterTool.java 2015-06-19 15:45:11.950303234 +0200
+@@ -174,7 +174,7 @@
+ Map source = super.getSource();
+ if (source == null)
+ {
+- source = expandSingletonArrays(getRequest().getParameterMap());
++ source = expandSingletonArrays((Map)(Object)getRequest().getParameterMap());
+ super.setSource(source);
+ }
+ return source;
diff --git a/velocity-tools-2.0-src.tar.gz b/velocity-tools-2.0-src.tar.gz
new file mode 100644
index 0000000..aa25efc
Binary files /dev/null and b/velocity-tools-2.0-src.tar.gz differ
diff --git a/velocity-tools.spec b/velocity-tools.spec
new file mode 100644
index 0000000..ed0b979
--- /dev/null
+++ b/velocity-tools.spec
@@ -0,0 +1,80 @@
+Name: velocity-tools
+Version: 2.0
+Release: 1
+Summary: Collection of useful tools for Velocity template engine
+License: ASL 2.0
+Url: http://velocity.apache.org/tools/releases/2.0/
+Source0: http://www.apache.org/dist/velocity/tools/%{version}/%{name}-%{version}-src.tar.gz
+Patch0: %{name}-%{version}-junit4.patch
+Patch1: %{name}-%{version}-dont_copy_test_lib.patch
+Patch2: %{name}-%{version}-servlet.patch
+Patch3: %{name}-%{version}-port-to-dom4j-2.0.patch
+BuildRequires: maven-local mvn(commons-beanutils:commons-beanutils)
+BuildRequires: mvn(commons-chain:commons-chain) mvn(commons-collections:commons-collections)
+BuildRequires: mvn(commons-digester:commons-digester) mvn(commons-lang:commons-lang)
+BuildRequires: mvn(commons-logging:commons-logging) mvn(commons-validator:commons-validator)
+BuildRequires: mvn(dom4j:dom4j) mvn(org.apache.maven.plugins:maven-resources-plugin)
+BuildRequires: mvn(org.apache.maven.shared:maven-filtering)
+BuildRequires: mvn(org.apache.maven.shared:maven-shared-components:pom:)
+BuildRequires: mvn(org.apache.struts:struts-core) mvn(org.apache.struts:struts-taglib)
+BuildRequires: mvn(org.apache.struts:struts-tiles) mvn(org.apache.tomcat:tomcat-jsp-api)
+BuildRequires: mvn(org.apache.tomcat:tomcat-servlet-api) mvn(org.apache.velocity:velocity)
+BuildRequires: mvn(oro:oro) mvn(sslext:sslext) mvn(org.apache.tomcat:tomcat-el-api)
+%if 0
+BuildRequires: mvn(httpunit:httpunit) = 1.6.1 mvn(nekohtml:nekohtml) = 0.9.5
+BuildRequires: mvn(org.mortbay.jetty:jetty-embedded) = 6.0.1 mvn(rhino:js) = 1.6R5
+BuildRequires: mvn(xerces:xercesImpl) = 2.8.1 mvn(xerces:xmlParserAPIs) = 2.6.2
+%endif
+BuildRequires: mvn(junit:junit) xmvn
+BuildArch: noarch
+%description
+The VelocityTools project is a collection of useful Java classes (aka tools),
+as well as infrastructure to easily, automatically and transparently
+make these tools available to Velocity templates.
+Project include easy integration of Velocity into the view-layer of
+web applications (via the VelocityViewTag and
+VelocityViewServlet) and integration with Struts 1.x applications.
+
+%package javadoc
+Summary: Javadoc for %{name}
+%description javadoc
+This package contains javadoc for %{name}.
+
+%prep
+%setup -q -n %{name}-%{version}-src
+find . -name "*.jar" -delete
+find . -name "*.class" -delete
+%patch0 -p1
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+sed -i 's/\r//' LICENSE NOTICE WHY_THREE_JARS.txt
+%pom_remove_dep javax.servlet:servlet-api
+%pom_add_dep org.apache.tomcat:tomcat-servlet-api::provided
+%pom_add_dep org.apache.tomcat:tomcat-jsp-api::provided
+%pom_xpath_remove "pom:project/pom:build/pom:outputDirectory"
+%pom_xpath_remove "pom:project/pom:build/pom:directory"
+%pom_remove_dep org.mortbay.jetty:jetty-embedded
+%mvn_file :%{name} %{name}
+%mvn_alias :%{name} %{name}:%{name}
+%mvn_alias :%{name} org.apache.velocity:%{name}-generic
+%mvn_alias :%{name} %{name}:%{name}-generic
+%mvn_alias :%{name} %{name}:%{name}-view
+%mvn_alias :%{name} org.apache.velocity:%{name}-view
+
+%build
+%mvn_build -f -- -Dproject.build.sourceEncoding=UTF-8
+
+%install
+%mvn_install
+
+%files -f .mfiles
+%doc CONTRIBUTORS README.txt STATUS WHY_THREE_JARS.txt
+%license LICENSE NOTICE
+
+%files javadoc -f .mfiles-javadoc
+%license LICENSE NOTICE
+
+%changelog
+* Wed Aug 19 2020 maminjie - 2.0-1
+- package init
diff --git a/velocity-tools.yaml b/velocity-tools.yaml
new file mode 100644
index 0000000..b34d5dd
--- /dev/null
+++ b/velocity-tools.yaml
@@ -0,0 +1,4 @@
+version_control: github
+src_repo: apache/velocity-tools
+tag_prefix: "^"
+seperator: "."