You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by ni...@apache.org on 2022/11/21 05:03:02 UTC

[lucenenet] 01/05: PERFORMANCE: Lucene.Net.Support.Arrays: Added Copy() overloads that use the most efficient (known) copy method for the platform and data type based on benchmarks. Replaced all occurrences of Array.Copy() and Buffer.BlockCopy() with Arrays.Copy().

This is an automated email from the ASF dual-hosted git repository.

nightowl888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucenenet.git

commit e8ca66e17106d601c4d0e54d93182947e524594b
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Wed Nov 16 14:50:08 2022 +0700

    PERFORMANCE: Lucene.Net.Support.Arrays: Added Copy() overloads that use the most efficient (known) copy method for the platform and data type based on benchmarks. Replaced all occurrences of Array.Copy() and Buffer.BlockCopy() with Arrays.Copy().
---
 .../Analysis/CharFilter/HTMLStripCharFilter.cs     |   5 +-
 .../Analysis/Compound/Hyphenation/ByteVector.cs    |   4 +-
 .../Analysis/Compound/Hyphenation/CharVector.cs    |   4 +-
 .../Compound/Hyphenation/HyphenationTree.cs        |   3 +-
 .../Analysis/Compound/Hyphenation/TernaryTree.cs   |  11 +-
 .../Analysis/De/GermanNormalizationFilter.cs       |   5 +-
 .../Analysis/En/PorterStemmer.cs                   |   2 +-
 .../Analysis/Hunspell/Stemmer.cs                   |  13 +-
 .../Analysis/Miscellaneous/CapitalizationFilter.cs |   7 +-
 .../Miscellaneous/Lucene47WordDelimiterFilter.cs   |   5 +-
 .../Analysis/Miscellaneous/PatternAnalyzer.cs      |   7 +-
 .../Miscellaneous/RemoveDuplicatesTokenFilter.cs   |   5 +-
 .../Analysis/Miscellaneous/WordDelimiterFilter.cs  |   2 +-
 .../Analysis/NGram/NGramTokenizer.cs               |   3 +-
 .../Analysis/Pt/RSLPStemmerBase.cs                 |   3 +-
 .../Analysis/Standard/ClassicTokenizerImpl.cs      |   7 +-
 .../Analysis/Standard/StandardTokenizerImpl.cs     |   5 +-
 .../Standard/Std31/StandardTokenizerImpl31.cs      |   5 +-
 .../Standard/Std31/UAX29URLEmailTokenizerImpl31.cs |   5 +-
 .../Standard/Std34/StandardTokenizerImpl34.cs      |   5 +-
 .../Standard/Std34/UAX29URLEmailTokenizerImpl34.cs |   5 +-
 .../Standard/Std36/UAX29URLEmailTokenizerImpl36.cs |   5 +-
 .../Standard/Std40/StandardTokenizerImpl40.cs      |   5 +-
 .../Standard/Std40/UAX29URLEmailTokenizerImpl40.cs |   5 +-
 .../Standard/UAX29URLEmailTokenizerImpl.cs         |   5 +-
 .../Analysis/Synonym/SynonymFilter.cs              |   7 +-
 .../Analysis/Synonym/SynonymMap.cs                 |   9 +-
 .../Analysis/Synonym/WordnetSynonymParser.cs       |   3 +-
 .../Analysis/Tr/TurkishLowerCaseFilter.cs          |   5 +-
 .../Analysis/Util/BufferedCharFilter.cs            |   7 +-
 .../Analysis/Util/CharArrayMap.cs                  |   4 +-
 .../Analysis/Util/OpenStringBuilder.cs             |   7 +-
 .../Analysis/Util/RollingCharBuffer.cs             |  13 +-
 .../Analysis/Util/SegmentingTokenizerBase.cs       |   3 +-
 .../Analysis/Util/StemmerUtil.cs                   |   7 +-
 .../Analysis/Wikipedia/WikipediaTokenizerImpl.cs   |   5 +-
 .../Collation/CollationKeyFilter.cs                |   7 +-
 .../Tartarus/Snowball/SnowballProgram.cs           |   4 +-
 .../Analysis/Icu/ICUTransformFilter.cs             |   6 +-
 .../Analysis/Icu/Segmentation/ICUTokenizer.cs      |   2 +-
 .../Dict/BinaryDictionary.cs                       |   3 +-
 .../JapaneseTokenizer.cs                           |   8 +-
 .../Language/ColognePhonetic.cs                    |   5 +-
 .../Language/Nysiis.cs                             |   3 +-
 .../Language/RefinedSoundex.cs                     |   3 +-
 .../Language/Soundex.cs                            |   3 +-
 src/Lucene.Net.Analysis.SmartCn/Hhmm/BiSegGraph.cs |   4 +-
 .../Hhmm/WordDictionary.cs                         |   3 +-
 .../ByTask/Tasks/SearchWithSortTask.cs             |   3 +-
 .../Support/Sax/Ext/Attributes2Impl.cs             |   9 +-
 .../Support/Sax/Helpers/AttributesImpl.cs          |   5 +-
 .../Support/Sax/Helpers/NamespaceSupport.cs        |   2 +-
 .../Support/TagSoup/HTMLScanner.cs                 |   3 +-
 .../BlockTerms/BlockTermsWriter.cs                 |   3 +-
 .../Memory/DirectPostingsFormat.cs                 |  14 +-
 src/Lucene.Net.Codecs/Memory/FSTOrdTermsReader.cs  |   2 +-
 src/Lucene.Net.Codecs/Memory/FSTOrdTermsWriter.cs  |   5 +-
 src/Lucene.Net.Codecs/Memory/FSTTermsReader.cs     |   3 +-
 .../Memory/MemoryPostingsFormat.cs                 |   5 +-
 .../Pulsing/PulsingPostingsReader.cs               |  10 +-
 .../SimpleText/SimpleTextFieldsReader.cs           |   5 +-
 .../SimpleText/SimpleTextStoredFieldsReader.cs     |   3 +-
 .../SimpleText/SimpleTextTermVectorsReader.cs      |   5 +-
 src/Lucene.Net.Facet/FacetsCollector.cs            |   2 +-
 src/Lucene.Net.Facet/FacetsConfig.cs               |   4 +-
 .../RandomSamplingFacetsCollector.cs               |   3 +-
 .../Taxonomy/CachedOrdinalsReader.cs               |   4 +-
 .../Taxonomy/Directory/TaxonomyIndexArrays.cs      |   6 +-
 src/Lucene.Net.Facet/Taxonomy/FacetLabel.cs        |   4 +-
 src/Lucene.Net.Facet/Taxonomy/TaxonomyReader.cs    |   3 +-
 .../Taxonomy/WriterCache/CharBlockArray.cs         |   5 +-
 src/Lucene.Net.Grouping/TopGroups.cs               |   2 +-
 .../PostingsHighlight/Passage.cs                   |   7 +-
 .../PostingsHighlight/PostingsHighlighter.cs       |   8 +-
 .../Support/ToParentBlockJoinCollector.cs          |   2 +-
 src/Lucene.Net.Join/ToParentBlockJoinCollector.cs  |   2 +-
 src/Lucene.Net.Misc/Index/Sorter/Sorter.cs         |   3 +-
 .../Index/Sorter/SortingAtomicReader.cs            |   8 +-
 src/Lucene.Net.Queries/TermsFilter.cs              |   2 +-
 .../Classic/FastCharStream.cs                      |   9 +-
 .../Flexible/Core/Util/UnescapedCharSequence.cs    |   5 +-
 .../Flexible/Standard/Parser/FastCharStream.cs     |   9 +-
 .../Surround/Parser/FastCharStream.cs              |   9 +-
 .../Queries/SlowFuzzyTermsEnum.cs                  |   3 +-
 src/Lucene.Net.Suggest/Spell/DirectSpellChecker.cs |   2 +-
 .../Spell/WordBreakSpellChecker.cs                 |   2 +-
 .../Suggest/Analyzing/AnalyzingSuggester.cs        |   6 +-
 .../Suggest/Analyzing/FuzzySuggester.cs            |   3 +-
 .../Codecs/RAMOnly/RAMOnlyPostingsFormat.cs        |   3 +-
 .../Index/BasePostingsFormatTestCase.cs            |   3 +-
 .../Index/MockIndexInput.cs                        |   4 +-
 .../Search/ShardSearchingTestBase.cs               |   2 +-
 .../Store/BaseDirectoryTestCase.cs                 |   4 +-
 src/Lucene.Net.TestFramework/Util/Fst/FSTTester.cs |   3 +-
 .../Util/LuceneTestCase.cs                         |   2 +-
 .../Analysis/Util/TestBufferedCharFilter.cs        |   3 +-
 src/Lucene.Net.Tests.Facet/TestDrillSideways.cs    |   2 +-
 src/Lucene.Net.Tests.Grouping/TestGrouping.cs      |   2 +-
 .../Compressing/AbstractTestLZ4CompressionMode.cs  |   3 +-
 .../Codecs/Lucene41/TestBlockPostingsFormat3.cs    |   3 +-
 src/Lucene.Net.Tests/Index/TestPayloads.cs         |   7 +-
 src/Lucene.Net.Tests/Index/TestStressIndexing2.cs  |   2 +-
 src/Lucene.Net.Tests/Search/TestTopDocsMerge.cs    |   5 +-
 src/Lucene.Net.Tests/Store/TestCopyBytes.cs        |   3 +-
 src/Lucene.Net.Tests/Support/TestApiConsistency.cs |   2 +-
 src/Lucene.Net.Tests/Util/BaseSortTestCase.cs      |   4 +-
 src/Lucene.Net.Tests/Util/Fst/TestBytesStore.cs    |   6 +-
 .../TokenAttributes/CharTermAttributeImpl.cs       |  11 +-
 src/Lucene.Net/Codecs/BlockTreeTermsReader.cs      |  20 +-
 .../Compressing/CompressingStoredFieldsReader.cs   |   6 +-
 .../Compressing/CompressingTermVectorsWriter.cs    |   2 +-
 src/Lucene.Net/Codecs/Compressing/LZ4.cs           |   2 +-
 src/Lucene.Net/Codecs/Lucene40/BitVector.cs        |   2 +-
 .../Codecs/Lucene41/Lucene41PostingsWriter.cs      |   3 +-
 src/Lucene.Net/Codecs/MultiLevelSkipListReader.cs  |   3 +-
 src/Lucene.Net/Index/AutomatonTermsEnum.cs         |   5 +-
 src/Lucene.Net/Index/ByteSliceReader.cs            |   7 +-
 src/Lucene.Net/Index/DocFieldProcessor.cs          |   3 +-
 src/Lucene.Net/Index/DocFieldProcessorPerField.cs  |   5 +-
 src/Lucene.Net/Index/DocTermOrds.cs                |   9 +-
 .../Index/FreqProxTermsWriterPerField.cs           |  10 +-
 src/Lucene.Net/Index/ParallelPostingsArray.cs      |   9 +-
 src/Lucene.Net/Index/StoredFieldsProcessor.cs      |   4 +-
 src/Lucene.Net/Index/TermVectorsConsumer.cs        |   2 +-
 .../Index/TermVectorsConsumerPerField.cs           |   6 +-
 src/Lucene.Net/Lucene.Net.csproj                   |   2 +
 src/Lucene.Net/Search/ConstantScoreAutoRewrite.cs  |   5 +-
 src/Lucene.Net/Search/MinShouldMatchSumScorer.cs   |   3 +-
 src/Lucene.Net/Search/MultiPhraseQuery.cs          |   2 +-
 src/Lucene.Net/Search/PhraseQuery.cs               |   2 +-
 src/Lucene.Net/Search/QueryRescorer.cs             |   3 +-
 src/Lucene.Net/Search/ScoringRewrite.cs            |   3 +-
 src/Lucene.Net/Search/Spans/TermSpans.cs           |   5 +-
 src/Lucene.Net/Store/BufferedChecksum.cs           |   2 +-
 src/Lucene.Net/Store/BufferedIndexInput.cs         |  11 +-
 src/Lucene.Net/Store/BufferedIndexOutput.cs        |   4 +-
 src/Lucene.Net/Store/ByteArrayDataInput.cs         |   5 +-
 src/Lucene.Net/Store/ByteArrayDataOutput.cs        |   5 +-
 src/Lucene.Net/Store/RAMInputStream.cs             |   5 +-
 src/Lucene.Net/Store/RAMOutputStream.cs            |   4 +-
 src/Lucene.Net/Support/Arrays.cs                   | 422 +++++++++++++++++++++
 src/Lucene.Net/Support/ConcurrentHashSet.cs        |   2 +-
 src/Lucene.Net/Util/ArrayTimSorter.cs              |   3 +-
 src/Lucene.Net/Util/ArrayUtil.cs                   |  39 +-
 src/Lucene.Net/Util/Automaton/Automaton.cs         |   3 +-
 src/Lucene.Net/Util/Automaton/SortedIntSet.cs      |   7 +-
 src/Lucene.Net/Util/Automaton/UTF32ToUTF8.cs       |   3 +-
 src/Lucene.Net/Util/ByteBlockPool.cs               |  10 +-
 src/Lucene.Net/Util/BytesRef.cs                    |   6 +-
 src/Lucene.Net/Util/BytesRefHash.cs                |   4 +-
 src/Lucene.Net/Util/CharsRef.cs                    |   6 +-
 src/Lucene.Net/Util/FixedBitSet.cs                 |   2 +-
 src/Lucene.Net/Util/Fst/Builder.cs                 |   4 +-
 src/Lucene.Net/Util/Fst/ByteSequenceOutputs.cs     |   7 +-
 src/Lucene.Net/Util/Fst/BytesStore.cs              |  15 +-
 src/Lucene.Net/Util/Fst/CharSequenceOutputs.cs     |   7 +-
 src/Lucene.Net/Util/Fst/FSTEnum.cs                 |   5 +-
 src/Lucene.Net/Util/Fst/ForwardBytesReader.cs      |   3 +-
 src/Lucene.Net/Util/Fst/IntSequenceOutputs.cs      |   7 +-
 src/Lucene.Net/Util/Fst/Util.cs                    |   3 +-
 src/Lucene.Net/Util/GrowableByteArrayDataOutput.cs |   4 +-
 src/Lucene.Net/Util/IntBlockPool.cs                |   2 +-
 src/Lucene.Net/Util/IntsRef.cs                     |   2 +-
 src/Lucene.Net/Util/LongBitSet.cs                  |   2 +-
 src/Lucene.Net/Util/LongsRef.cs                    |   2 +-
 src/Lucene.Net/Util/OpenBitSet.cs                  |   4 +-
 .../Util/Packed/AppendingDeltaPackedLongBuffer.cs  |   2 +-
 .../Util/Packed/AppendingPackedLongBuffer.cs       |   3 +-
 src/Lucene.Net/Util/Packed/Direct64.cs             |   6 +-
 .../Util/Packed/MonotonicAppendingLongBuffer.cs    |   2 +-
 src/Lucene.Net/Util/Packed/PackedInts.cs           |   4 +-
 src/Lucene.Net/Util/PagedBytes.cs                  |  18 +-
 src/Lucene.Net/Util/RecyclingByteBlockAllocator.cs |   5 +-
 src/Lucene.Net/Util/RecyclingIntBlockAllocator.cs  |   5 +-
 src/Lucene.Net/Util/RollingBuffer.cs               |   7 +-
 src/Lucene.Net/Util/UnicodeUtil.cs                 |   3 +-
 176 files changed, 917 insertions(+), 387 deletions(-)

diff --git a/src/Lucene.Net.Analysis.Common/Analysis/CharFilter/HTMLStripCharFilter.cs b/src/Lucene.Net.Analysis.Common/Analysis/CharFilter/HTMLStripCharFilter.cs
index efc80ba27..c1955b704 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/CharFilter/HTMLStripCharFilter.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/CharFilter/HTMLStripCharFilter.cs
@@ -2,6 +2,7 @@
 using J2N;
 using Lucene.Net.Analysis.Util;
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using Lucene.Net.Support.Text;
 using Lucene.Net.Util;
 using System;
@@ -30994,7 +30995,7 @@ namespace Lucene.Net.Analysis.CharFilters
             /* first: make room (if you can) */
             if (zzStartRead > 0)
             {
-                Array.Copy(zzBuffer, zzStartRead,
+                Arrays.Copy(zzBuffer, zzStartRead,
                                  zzBuffer, 0,
                                  zzEndRead - zzStartRead);
 
@@ -31010,7 +31011,7 @@ namespace Lucene.Net.Analysis.CharFilters
             {
                 /* if not: blow it up */
                 char[] newBuffer = new char[zzCurrentPos * 2];
-                Array.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
+                Arrays.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
                 zzBuffer = newBuffer;
             }
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/ByteVector.cs b/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/ByteVector.cs
index 82cbf6892..aa025163b 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/ByteVector.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/ByteVector.cs
@@ -131,7 +131,7 @@ namespace Lucene.Net.Analysis.Compound.Hyphenation
             if (n + size >= len)
             {
                 byte[] aux = new byte[len + blockSize];
-                System.Array.Copy(array, 0, aux, 0, len);
+                Arrays.Copy(array, 0, aux, 0, len);
                 array = aux;
             }
             n += size;
@@ -143,7 +143,7 @@ namespace Lucene.Net.Analysis.Compound.Hyphenation
             if (n < array.Length)
             {
                 byte[] aux = new byte[n];
-                System.Array.Copy(array, 0, aux, 0, n);
+                Arrays.Copy(array, 0, aux, 0, n);
                 array = aux;
             }
         }
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/CharVector.cs b/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/CharVector.cs
index 30c71722e..854e053bb 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/CharVector.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/CharVector.cs
@@ -143,7 +143,7 @@ namespace Lucene.Net.Analysis.Compound.Hyphenation
             if (n + size >= len)
             {
                 char[] aux = new char[len + blockSize];
-                System.Array.Copy(array, 0, aux, 0, len);
+                Arrays.Copy(array, 0, aux, 0, len);
                 array = aux;
             }
             n += size;
@@ -155,7 +155,7 @@ namespace Lucene.Net.Analysis.Compound.Hyphenation
             if (n < array.Length)
             {
                 char[] aux = new char[n];
-                System.Array.Copy(array, 0, aux, 0, n);
+                Arrays.Copy(array, 0, aux, 0, n);
                 array = aux;
             }
         }
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/HyphenationTree.cs b/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/HyphenationTree.cs
index 82f094da3..85786fb02 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/HyphenationTree.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/HyphenationTree.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using J2N.Numerics;
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 using System.IO;
@@ -508,7 +509,7 @@ namespace Lucene.Net.Analysis.Compound.Hyphenation
             {
                 // trim result array
                 int[] res = new int[k + 2];
-                Array.Copy(result, 0, res, 1, k);
+                Arrays.Copy(result, 0, res, 1, k);
                 // We add the synthetical hyphenation points
                 // at the beginning and end of the word
                 res[0] = 0;
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/TernaryTree.cs b/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/TernaryTree.cs
index d16d1e9f6..5a0cd42b1 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/TernaryTree.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Compound/Hyphenation/TernaryTree.cs
@@ -1,4 +1,5 @@
-// Lucene version compatibility level 4.8.1
+// Lucene version compatibility level 4.8.1
+using Lucene.Net.Support;
 using System;
 using System.Collections;
 using System.Collections.Generic;
@@ -386,16 +387,16 @@ namespace Lucene.Net.Analysis.Compound.Hyphenation
         {
             int len = newsize < m_lo.Length ? newsize : m_lo.Length;
             char[] na = new char[newsize];
-            Array.Copy(m_lo, 0, na, 0, len);
+            Arrays.Copy(m_lo, 0, na, 0, len);
             m_lo = na;
             na = new char[newsize];
-            Array.Copy(m_hi, 0, na, 0, len);
+            Arrays.Copy(m_hi, 0, na, 0, len);
             m_hi = na;
             na = new char[newsize];
-            Array.Copy(m_eq, 0, na, 0, len);
+            Arrays.Copy(m_eq, 0, na, 0, len);
             m_eq = na;
             na = new char[newsize];
-            Array.Copy(m_sc, 0, na, 0, len);
+            Arrays.Copy(m_sc, 0, na, 0, len);
             m_sc = na;
         }
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/De/GermanNormalizationFilter.cs b/src/Lucene.Net.Analysis.Common/Analysis/De/GermanNormalizationFilter.cs
index 6235342e4..cbab90375 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/De/GermanNormalizationFilter.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/De/GermanNormalizationFilter.cs
@@ -1,6 +1,7 @@
-// Lucene version compatibility level 4.8.1
+// Lucene version compatibility level 4.8.1
 using Lucene.Net.Analysis.TokenAttributes;
 using Lucene.Net.Analysis.Util;
+using Lucene.Net.Support;
 using System;
 
 namespace Lucene.Net.Analysis.De
@@ -103,7 +104,7 @@ namespace Lucene.Net.Analysis.De
                             buffer = termAtt.ResizeBuffer(1 + length);
                             if (i < length)
                             {
-                                Array.Copy(buffer, i, buffer, i + 1, (length - i));
+                                Arrays.Copy(buffer, i, buffer, i + 1, (length - i));
                             }
                             buffer[i] = 's';
                             length++;
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/En/PorterStemmer.cs b/src/Lucene.Net.Analysis.Common/Analysis/En/PorterStemmer.cs
index 72dab0413..729dba75c 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/En/PorterStemmer.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/En/PorterStemmer.cs
@@ -752,7 +752,7 @@ namespace Lucene.Net.Analysis.En
             {
                 b = new char[ArrayUtil.Oversize(wordLen, RamUsageEstimator.NUM_BYTES_CHAR)];
             }
-            Array.Copy(wordBuffer, offset, b, 0, wordLen);
+            Arrays.Copy(wordBuffer, offset, b, 0, wordLen);
             i = wordLen;
             return Stem(0);
         }
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Hunspell/Stemmer.cs b/src/Lucene.Net.Analysis.Common/Analysis/Hunspell/Stemmer.cs
index e15e6365c..5869a322f 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Hunspell/Stemmer.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Hunspell/Stemmer.cs
@@ -4,6 +4,7 @@ using J2N.Text;
 using Lucene.Net.Analysis.Util;
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Store;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using Lucene.Net.Util.Automaton;
 using Lucene.Net.Util.Fst;
@@ -174,7 +175,7 @@ namespace Lucene.Net.Analysis.Hunspell
         private void CaseFoldTitle(char[] word, int length)
         {
             titleBuffer = ArrayUtil.Grow(titleBuffer, length);
-            System.Array.Copy(word, 0, titleBuffer, 0, length);
+            Arrays.Copy(word, 0, titleBuffer, 0, length);
             for (int i = 1; i < length; i++)
             {
                 titleBuffer[i] = dictionary.CaseFold(titleBuffer[i]);
@@ -185,7 +186,7 @@ namespace Lucene.Net.Analysis.Hunspell
         private void CaseFoldLower(char[] word, int length)
         {
             lowerBuffer = ArrayUtil.Grow(lowerBuffer, length);
-            System.Array.Copy(word, 0, lowerBuffer, 0, length);
+            Arrays.Copy(word, 0, lowerBuffer, 0, length);
             lowerBuffer[0] = dictionary.CaseFold(lowerBuffer[0]);
         }
 
@@ -445,8 +446,8 @@ namespace Lucene.Net.Analysis.Hunspell
                             }
 
                             char[] strippedWord = new char[stripLength + deAffixedLength];
-                            Array.Copy(dictionary.stripData, stripStart, strippedWord, 0, stripLength);
-                            Array.Copy(word, deAffixedStart, strippedWord, stripLength, deAffixedLength);
+                            Arrays.Copy(dictionary.stripData, stripStart, strippedWord, 0, stripLength);
+                            Arrays.Copy(word, deAffixedStart, strippedWord, stripLength, deAffixedLength);
 
                             IList<CharsRef> stemList = ApplyAffix(strippedWord, strippedWord.Length, prefix, -1, recursionDepth, true, circumfix, caseVariant);
 
@@ -550,8 +551,8 @@ namespace Lucene.Net.Analysis.Hunspell
                             }
 
                             char[] strippedWord = new char[stripLength + deAffixedLength];
-                            Array.Copy(word, 0, strippedWord, 0, deAffixedLength);
-                            Array.Copy(dictionary.stripData, stripStart, strippedWord, deAffixedLength, stripLength);
+                            Arrays.Copy(word, 0, strippedWord, 0, deAffixedLength);
+                            Arrays.Copy(dictionary.stripData, stripStart, strippedWord, deAffixedLength, stripLength);
 
                             IList<CharsRef> stemList = ApplyAffix(strippedWord, strippedWord.Length, suffix, prefixFlag, recursionDepth, false, circumfix, caseVariant);
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/CapitalizationFilter.cs b/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/CapitalizationFilter.cs
index 4677dbb48..696b615ec 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/CapitalizationFilter.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/CapitalizationFilter.cs
@@ -1,9 +1,10 @@
 // Lucene version compatibility level 4.8.1
+using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Analysis.Util;
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 using System.Globalization;
-using Lucene.Net.Analysis.TokenAttributes;
-using Lucene.Net.Analysis.Util;
 
 namespace Lucene.Net.Analysis.Miscellaneous
 {
@@ -164,7 +165,7 @@ namespace Lucene.Net.Analysis.Miscellaneous
             {
                 //make a backup in case we exceed the word count
                 backup = new char[termBufferLength];
-                Array.Copy(termBuffer, 0, backup, 0, termBufferLength);
+                Arrays.Copy(termBuffer, 0, backup, 0, termBufferLength);
             }
 
             if (termBufferLength < maxTokenLength)
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/Lucene47WordDelimiterFilter.cs b/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/Lucene47WordDelimiterFilter.cs
index 0511abd53..dd1c9e95d 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/Lucene47WordDelimiterFilter.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/Lucene47WordDelimiterFilter.cs
@@ -1,8 +1,9 @@
-// Lucene version compatibility level 4.8.1
+// Lucene version compatibility level 4.8.1
 using System;
 using System.Text;
 using Lucene.Net.Analysis.TokenAttributes;
 using Lucene.Net.Analysis.Util;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 
 namespace Lucene.Net.Analysis.Miscellaneous
@@ -290,7 +291,7 @@ namespace Lucene.Net.Analysis.Miscellaneous
                 savedBuffer = new char[ArrayUtil.Oversize(termAttribute.Length, RamUsageEstimator.NUM_BYTES_CHAR)];
             }
 
-            Array.Copy(termAttribute.Buffer, 0, savedBuffer, 0, termAttribute.Length);
+            Arrays.Copy(termAttribute.Buffer, 0, savedBuffer, 0, termAttribute.Length);
             iterator.text = savedBuffer;
 
             hasSavedState = true;
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/PatternAnalyzer.cs b/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/PatternAnalyzer.cs
index ce1d37cf3..d19da155d 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/PatternAnalyzer.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/PatternAnalyzer.cs
@@ -2,6 +2,7 @@
 using Lucene.Net.Analysis.Core;
 using Lucene.Net.Analysis.TokenAttributes;
 using Lucene.Net.Analysis.Util;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
 using System.IO;
@@ -323,14 +324,14 @@ namespace Lucene.Net.Analysis.Miscellaneous
                     if (len + n > output.Length) // grow capacity
                     {
                         char[] tmp = new char[Math.Max(output.Length << 1, len + n)];
-                        Array.Copy(output, 0, tmp, 0, len);
-                        Array.Copy(buffer, 0, tmp, len, n);
+                        Arrays.Copy(output, 0, tmp, 0, len);
+                        Arrays.Copy(buffer, 0, tmp, len, n);
                         buffer = output; // use larger buffer for future larger bulk reads
                         output = tmp;
                     }
                     else
                     {
-                        Array.Copy(buffer, 0, output, len, n);
+                        Arrays.Copy(buffer, 0, output, len, n);
                     }
                     len += n;
                 }
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/RemoveDuplicatesTokenFilter.cs b/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/RemoveDuplicatesTokenFilter.cs
index 37dc0392b..d70d664c4 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/RemoveDuplicatesTokenFilter.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/RemoveDuplicatesTokenFilter.cs
@@ -1,6 +1,7 @@
-// Lucene version compatibility level 4.8.1
+// Lucene version compatibility level 4.8.1
 using Lucene.Net.Analysis.TokenAttributes;
 using Lucene.Net.Analysis.Util;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
 
@@ -88,7 +89,7 @@ namespace Lucene.Net.Analysis.Miscellaneous
 
                 // clone the term, and add to the set of seen terms.
                 char[] saved = new char[length];
-                Array.Copy(term, 0, saved, 0, length);
+                Arrays.Copy(term, 0, saved, 0, length);
                 previous.Add(saved);
 
                 if (!duplicate)
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/WordDelimiterFilter.cs b/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/WordDelimiterFilter.cs
index def502153..13bbf5f14 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/WordDelimiterFilter.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/WordDelimiterFilter.cs
@@ -490,7 +490,7 @@ namespace Lucene.Net.Analysis.Miscellaneous
                 savedBuffer = new char[ArrayUtil.Oversize(termAttribute.Length, RamUsageEstimator.NUM_BYTES_CHAR)];
             }
 
-            Array.Copy(termAttribute.Buffer, 0, savedBuffer, 0, termAttribute.Length);
+            Arrays.Copy(termAttribute.Buffer, 0, savedBuffer, 0, termAttribute.Length);
             iterator.text = savedBuffer;
 
             hasSavedState = true;
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/NGram/NGramTokenizer.cs b/src/Lucene.Net.Analysis.Common/Analysis/NGram/NGramTokenizer.cs
index 36cc3893a..8930ed1f2 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/NGram/NGramTokenizer.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/NGram/NGramTokenizer.cs
@@ -3,6 +3,7 @@ using J2N;
 using Lucene.Net.Analysis.TokenAttributes;
 using Lucene.Net.Analysis.Util;
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
 using System.Diagnostics;
@@ -216,7 +217,7 @@ namespace Lucene.Net.Analysis.NGram
                 // compact
                 if (bufferStart >= bufferEnd - maxGram - 1 && !exhausted)
                 {
-                    Array.Copy(buffer, bufferStart, buffer, 0, bufferEnd - bufferStart);
+                    Arrays.Copy(buffer, bufferStart, buffer, 0, bufferEnd - bufferStart);
                     bufferEnd -= bufferStart;
                     lastCheckedChar -= bufferStart;
                     lastNonTokenChar -= bufferStart;
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Pt/RSLPStemmerBase.cs b/src/Lucene.Net.Analysis.Common/Analysis/Pt/RSLPStemmerBase.cs
index e70211062..d9ab00ac1 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Pt/RSLPStemmerBase.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Pt/RSLPStemmerBase.cs
@@ -3,6 +3,7 @@ using J2N.Collections.Generic.Extensions;
 using J2N.Text;
 using Lucene.Net.Analysis.Util;
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
@@ -115,7 +116,7 @@ namespace Lucene.Net.Analysis.Pt
             {
                 if (m_replacement.Length > 0)
                 {
-                    Array.Copy(m_replacement, 0, s, len - m_suffix.Length, m_replacement.Length);
+                    Arrays.Copy(m_replacement, 0, s, len - m_suffix.Length, m_replacement.Length);
                 }
                 return len - m_suffix.Length + m_replacement.Length;
             }
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Standard/ClassicTokenizerImpl.cs b/src/Lucene.Net.Analysis.Common/Analysis/Standard/ClassicTokenizerImpl.cs
index 57cd51ddc..d3b89b048 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Standard/ClassicTokenizerImpl.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Standard/ClassicTokenizerImpl.cs
@@ -1,8 +1,9 @@
 // Lucene version compatibility level 4.8.1
 /* The following code was generated by JFlex 1.5.1 */
+using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Support;
 using System;
 using System.IO;
-using Lucene.Net.Analysis.TokenAttributes;
 
 namespace Lucene.Net.Analysis.Standard
 {
@@ -454,7 +455,7 @@ namespace Lucene.Net.Analysis.Standard
             /* first: make room (if you can) */
             if (zzStartRead > 0)
             {
-                Array.Copy(zzBuffer, zzStartRead, zzBuffer, 0, zzEndRead - zzStartRead);
+                Arrays.Copy(zzBuffer, zzStartRead, zzBuffer, 0, zzEndRead - zzStartRead);
 
                 /* translate stored positions */
                 zzEndRead -= zzStartRead;
@@ -468,7 +469,7 @@ namespace Lucene.Net.Analysis.Standard
             {
                 /* if not: blow it up */
                 char[] newBuffer = new char[zzCurrentPos * 2];
-                Array.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
+                Arrays.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
                 zzBuffer = newBuffer;
             }
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Standard/StandardTokenizerImpl.cs b/src/Lucene.Net.Analysis.Common/Analysis/Standard/StandardTokenizerImpl.cs
index 1e53c1da7..a1a4c813c 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Standard/StandardTokenizerImpl.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Standard/StandardTokenizerImpl.cs
@@ -1,6 +1,7 @@
 // Lucene version compatibility level 4.8.1
 // The following code was generated by JFlex 1.5.1
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Support;
 using System;
 using System.IO;
 
@@ -1051,7 +1052,7 @@ namespace Lucene.Net.Analysis.Standard
             /* first: make room (if you can) */
             if (zzStartRead > 0)
             {
-                Array.Copy(zzBuffer, zzStartRead, zzBuffer, 0, zzEndRead - zzStartRead);
+                Arrays.Copy(zzBuffer, zzStartRead, zzBuffer, 0, zzEndRead - zzStartRead);
 
                 /* translate stored positions */
                 zzEndRead -= zzStartRead;
@@ -1065,7 +1066,7 @@ namespace Lucene.Net.Analysis.Standard
             {
                 /* if not: blow it up */
                 char[] newBuffer = new char[zzCurrentPos * 2];
-                Array.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
+                Arrays.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
                 zzBuffer = newBuffer;
             }
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std31/StandardTokenizerImpl31.cs b/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std31/StandardTokenizerImpl31.cs
index 287524a5d..5df35f204 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std31/StandardTokenizerImpl31.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std31/StandardTokenizerImpl31.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Support;
 using System;
 using System.IO;
 
@@ -771,7 +772,7 @@ namespace Lucene.Net.Analysis.Standard.Std31
             /* first: make room (if you can) */
             if (zzStartRead > 0)
             {
-                System.Array.Copy(zzBuffer, zzStartRead,
+                Arrays.Copy(zzBuffer, zzStartRead,
                                  zzBuffer, 0,
                                  zzEndRead - zzStartRead);
 
@@ -787,7 +788,7 @@ namespace Lucene.Net.Analysis.Standard.Std31
             {
                 /* if not: blow it up */
                 char[] newBuffer = new char[zzCurrentPos * 2];
-                System.Array.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
+                Arrays.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
                 zzBuffer = newBuffer;
             }
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std31/UAX29URLEmailTokenizerImpl31.cs b/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std31/UAX29URLEmailTokenizerImpl31.cs
index 8597bc30c..3b4e9eab6 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std31/UAX29URLEmailTokenizerImpl31.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std31/UAX29URLEmailTokenizerImpl31.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Support;
 using System;
 using System.IO;
 
@@ -3330,7 +3331,7 @@ namespace Lucene.Net.Analysis.Standard.Std31
             /* first: make room (if you can) */
             if (zzStartRead > 0)
             {
-                System.Array.Copy(zzBuffer, zzStartRead,
+                Arrays.Copy(zzBuffer, zzStartRead,
                                  zzBuffer, 0,
                                  zzEndRead - zzStartRead);
 
@@ -3346,7 +3347,7 @@ namespace Lucene.Net.Analysis.Standard.Std31
             {
                 /* if not: blow it up */
                 char[] newBuffer = new char[zzCurrentPos * 2];
-                System.Array.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
+                Arrays.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
                 zzBuffer = newBuffer;
             }
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std34/StandardTokenizerImpl34.cs b/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std34/StandardTokenizerImpl34.cs
index 0c4a61562..17b6fabb6 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std34/StandardTokenizerImpl34.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std34/StandardTokenizerImpl34.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Support;
 using System;
 using System.IO;
 
@@ -791,7 +792,7 @@ namespace Lucene.Net.Analysis.Standard.Std34
             /* first: make room (if you can) */
             if (zzStartRead > 0)
             {
-                System.Array.Copy(zzBuffer, zzStartRead,
+                Arrays.Copy(zzBuffer, zzStartRead,
                                  zzBuffer, 0,
                                  zzEndRead - zzStartRead);
 
@@ -807,7 +808,7 @@ namespace Lucene.Net.Analysis.Standard.Std34
             {
                 /* if not: blow it up */
                 char[] newBuffer = new char[zzCurrentPos * 2];
-                System.Array.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
+                Arrays.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
                 zzBuffer = newBuffer;
             }
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std34/UAX29URLEmailTokenizerImpl34.cs b/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std34/UAX29URLEmailTokenizerImpl34.cs
index 7f69ca3b6..f2f2db8fc 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std34/UAX29URLEmailTokenizerImpl34.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std34/UAX29URLEmailTokenizerImpl34.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Support;
 using System;
 using System.IO;
 
@@ -3437,7 +3438,7 @@ namespace Lucene.Net.Analysis.Standard.Std34
             /* first: make room (if you can) */
             if (zzStartRead > 0)
             {
-                System.Array.Copy(zzBuffer, zzStartRead,
+                Arrays.Copy(zzBuffer, zzStartRead,
                                  zzBuffer, 0,
                                  zzEndRead - zzStartRead);
 
@@ -3453,7 +3454,7 @@ namespace Lucene.Net.Analysis.Standard.Std34
             {
                 /* if not: blow it up */
                 char[] newBuffer = new char[zzCurrentPos * 2];
-                System.Array.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
+                Arrays.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
                 zzBuffer = newBuffer;
             }
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std36/UAX29URLEmailTokenizerImpl36.cs b/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std36/UAX29URLEmailTokenizerImpl36.cs
index 24629bf58..8266058f1 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std36/UAX29URLEmailTokenizerImpl36.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std36/UAX29URLEmailTokenizerImpl36.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Support;
 using System;
 using System.IO;
 
@@ -3872,7 +3873,7 @@ namespace Lucene.Net.Analysis.Standard.Std36
             /* first: make room (if you can) */
             if (zzStartRead > 0)
             {
-                System.Array.Copy(zzBuffer, zzStartRead,
+                Arrays.Copy(zzBuffer, zzStartRead,
                                  zzBuffer, 0,
                                  zzEndRead - zzStartRead);
 
@@ -3888,7 +3889,7 @@ namespace Lucene.Net.Analysis.Standard.Std36
             {
                 /* if not: blow it up */
                 char[] newBuffer = new char[zzCurrentPos * 2];
-                System.Array.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
+                Arrays.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
                 zzBuffer = newBuffer;
             }
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std40/StandardTokenizerImpl40.cs b/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std40/StandardTokenizerImpl40.cs
index d2c1c9a8e..c6be8da62 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std40/StandardTokenizerImpl40.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std40/StandardTokenizerImpl40.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Support;
 using System;
 using System.IO;
 
@@ -901,7 +902,7 @@ namespace Lucene.Net.Analysis.Standard.Std40
             /* first: make room (if you can) */
             if (zzStartRead > 0)
             {
-                System.Array.Copy(zzBuffer, zzStartRead,
+                Arrays.Copy(zzBuffer, zzStartRead,
                                  zzBuffer, 0,
                                  zzEndRead - zzStartRead);
 
@@ -917,7 +918,7 @@ namespace Lucene.Net.Analysis.Standard.Std40
             {
                 /* if not: blow it up */
                 char[] newBuffer = new char[zzCurrentPos * 2];
-                System.Array.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
+                Arrays.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
                 zzBuffer = newBuffer;
             }
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std40/UAX29URLEmailTokenizerImpl40.cs b/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std40/UAX29URLEmailTokenizerImpl40.cs
index 729302a17..d090adb8e 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std40/UAX29URLEmailTokenizerImpl40.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Standard/Std40/UAX29URLEmailTokenizerImpl40.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Support;
 using System;
 using System.IO;
 
@@ -4087,7 +4088,7 @@ namespace Lucene.Net.Analysis.Standard.Std40
             /* first: make room (if you can) */
             if (zzStartRead > 0)
             {
-                System.Array.Copy(zzBuffer, zzStartRead,
+                Arrays.Copy(zzBuffer, zzStartRead,
                                  zzBuffer, 0,
                                  zzEndRead - zzStartRead);
 
@@ -4103,7 +4104,7 @@ namespace Lucene.Net.Analysis.Standard.Std40
             {
                 /* if not: blow it up */
                 char[] newBuffer = new char[zzCurrentPos * 2];
-                System.Array.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
+                Arrays.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
                 zzBuffer = newBuffer;
             }
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Standard/UAX29URLEmailTokenizerImpl.cs b/src/Lucene.Net.Analysis.Common/Analysis/Standard/UAX29URLEmailTokenizerImpl.cs
index c011c675e..537d361ed 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Standard/UAX29URLEmailTokenizerImpl.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Standard/UAX29URLEmailTokenizerImpl.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Support;
 using System;
 using System.IO;
 
@@ -9194,7 +9195,7 @@ namespace Lucene.Net.Analysis.Standard
             /* first: make room (if you can) */
             if (zzStartRead > 0)
             {
-                System.Array.Copy(zzBuffer, zzStartRead,
+                Arrays.Copy(zzBuffer, zzStartRead,
                                  zzBuffer, 0,
                                  zzEndRead - zzStartRead);
 
@@ -9210,7 +9211,7 @@ namespace Lucene.Net.Analysis.Standard
             {
                 /* if not: blow it up */
                 char[] newBuffer = new char[zzCurrentPos * 2];
-                System.Array.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
+                Arrays.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
                 zzBuffer = newBuffer;
             }
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Synonym/SynonymFilter.cs b/src/Lucene.Net.Analysis.Common/Analysis/Synonym/SynonymFilter.cs
index 4044abe09..134508f5e 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Synonym/SynonymFilter.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Synonym/SynonymFilter.cs
@@ -4,6 +4,7 @@ using J2N.Numerics;
 using Lucene.Net.Analysis.TokenAttributes;
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Store;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using Lucene.Net.Util.Fst;
 using System;
@@ -199,19 +200,19 @@ namespace Lucene.Net.Analysis.Synonym
                 if (count == outputs.Length)
                 {
                     CharsRef[] next = new CharsRef[ArrayUtil.Oversize(1 + count, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                    Array.Copy(outputs, 0, next, 0, count);
+                    Arrays.Copy(outputs, 0, next, 0, count);
                     outputs = next;
                 }
                 if (count == endOffsets.Length)
                 {
                     int[] next = new int[ArrayUtil.Oversize(1 + count, RamUsageEstimator.NUM_BYTES_INT32)];
-                    Array.Copy(endOffsets, 0, next, 0, count);
+                    Arrays.Copy(endOffsets, 0, next, 0, count);
                     endOffsets = next;
                 }
                 if (count == posLengths.Length)
                 {
                     int[] next = new int[ArrayUtil.Oversize(1 + count, RamUsageEstimator.NUM_BYTES_INT32)];
-                    Array.Copy(posLengths, 0, next, 0, count);
+                    Arrays.Copy(posLengths, 0, next, 0, count);
                     posLengths = next;
                 }
                 if (outputs[count] is null)
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Synonym/SynonymMap.cs b/src/Lucene.Net.Analysis.Common/Analysis/Synonym/SynonymMap.cs
index 15c2642d4..ea6329725 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Synonym/SynonymMap.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Synonym/SynonymMap.cs
@@ -2,6 +2,7 @@
 using Lucene.Net.Analysis.TokenAttributes;
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Store;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using Lucene.Net.Util.Fst;
 using System;
@@ -310,9 +311,9 @@ namespace Lucene.Net.Analysis.Synonym
                     int vIntLen = pos2 - pos;
 
                     // Move the count + includeOrig to the front of the byte[]:
-                    Array.Copy(scratch.Bytes, pos, spare, 0, vIntLen);
-                    Array.Copy(scratch.Bytes, 0, scratch.Bytes, vIntLen, pos);
-                    Array.Copy(spare, 0, scratch.Bytes, 0, vIntLen);
+                    Arrays.Copy(scratch.Bytes, pos, spare, 0, vIntLen);
+                    Arrays.Copy(scratch.Bytes, 0, scratch.Bytes, vIntLen, pos);
+                    Arrays.Copy(spare, 0, scratch.Bytes, 0, vIntLen);
 
                     if (dedupSet != null)
                     {
@@ -380,7 +381,7 @@ namespace Lucene.Net.Analysis.Synonym
                             reuse.Chars[end++] = SynonymMap.WORD_SEPARATOR;
                             reuse.Length++;
                         }
-                        Array.Copy(termAtt.Buffer, 0, reuse.Chars, end, length);
+                        Arrays.Copy(termAtt.Buffer, 0, reuse.Chars, end, length);
                         reuse.Length += length;
                     }
                     ts.End();
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Synonym/WordnetSynonymParser.cs b/src/Lucene.Net.Analysis.Common/Analysis/Synonym/WordnetSynonymParser.cs
index b81f7d7e5..1636ccfd4 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Synonym/WordnetSynonymParser.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Synonym/WordnetSynonymParser.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using J2N.Text;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
 using System.IO;
@@ -67,7 +68,7 @@ namespace Lucene.Net.Analysis.Synonym
                     if (synset.Length <= synsetSize + 1)
                     {
                         CharsRef[] larger = new CharsRef[synset.Length * 2];
-                        Array.Copy(synset, 0, larger, 0, synsetSize);
+                        Arrays.Copy(synset, 0, larger, 0, synsetSize);
                         synset = larger;
                     }
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Tr/TurkishLowerCaseFilter.cs b/src/Lucene.Net.Analysis.Common/Analysis/Tr/TurkishLowerCaseFilter.cs
index 8e8f87dbb..b97080487 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Tr/TurkishLowerCaseFilter.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Tr/TurkishLowerCaseFilter.cs
@@ -1,6 +1,7 @@
-// Lucene version compatibility level 4.8.1
+// Lucene version compatibility level 4.8.1
 using J2N;
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Support;
 using System;
 using System.Globalization;
 
@@ -137,7 +138,7 @@ namespace Lucene.Net.Analysis.Tr
         private static int Delete(char[] s, int pos, int len) // LUCENENET: CA1822: Mark members as static
         {
             if (pos < len)
-                Array.Copy(s, pos + 1, s, pos, len - pos - 1);
+                Arrays.Copy(s, pos + 1, s, pos, len - pos - 1);
 
             return len - 1;
         }
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Util/BufferedCharFilter.cs b/src/Lucene.Net.Analysis.Common/Analysis/Util/BufferedCharFilter.cs
index 0a683a9a2..183f07f22 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Util/BufferedCharFilter.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Util/BufferedCharFilter.cs
@@ -3,6 +3,7 @@
 // https://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/
 
 using Lucene.Net.Analysis.CharFilters;
+using Lucene.Net.Support;
 using Lucene.Net.Support.Threading;
 using System;
 using System.IO;
@@ -177,13 +178,13 @@ namespace Lucene.Net.Analysis.Util
                     newLength = markLimit;
                 }
                 char[] newbuf = new char[newLength];
-                System.Array.Copy(buf, 0, newbuf, 0, buf.Length);
+                Arrays.Copy(buf, 0, newbuf, 0, buf.Length);
                 buf = newbuf;
             }
             else if (mark > 0)
             {
                 /* make room by shifting the buffered data to left mark positions */
-                System.Array.Copy(buf, mark, buf, 0, buf.Length - mark);
+                Arrays.Copy(buf, mark, buf, 0, buf.Length - mark);
                 pos -= mark;
                 end -= mark;
                 mark = 0;
@@ -331,7 +332,7 @@ namespace Lucene.Net.Analysis.Util
                     if (available > 0)
                     {
                         int count2 = available >= outstanding ? outstanding : available;
-                        System.Array.Copy(buf, pos, buffer, offset, count2);
+                        Arrays.Copy(buf, pos, buffer, offset, count2);
                         pos += count2;
                         offset += count2;
                         outstanding -= count2;
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Util/CharArrayMap.cs b/src/Lucene.Net.Analysis.Common/Analysis/Util/CharArrayMap.cs
index 050da6771..487e52e4c 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Util/CharArrayMap.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Util/CharArrayMap.cs
@@ -3294,9 +3294,9 @@ namespace Lucene.Net.Analysis.Util
                 // use fast path instead of iterating all values
                 // this is even on very small sets ~10 times faster than iterating
                 var keys = new char[m.keys.Length][];
-                m.keys.AsSpan().CopyTo(keys.AsSpan());
+                Arrays.Copy(m.keys, 0, keys, 0, keys.Length);
                 var values = new CharArrayDictionary<TValue>.MapValue[m.values.Length];
-                m.values.AsSpan().CopyTo(values.AsSpan());
+                Arrays.Copy(m.values, 0, values, 0, values.Length);
                 m = new CharArrayDictionary<TValue>(m) { keys = keys, values = values };
                 return m;
             }
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Util/OpenStringBuilder.cs b/src/Lucene.Net.Analysis.Common/Analysis/Util/OpenStringBuilder.cs
index ad2f687a2..873421ccc 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Util/OpenStringBuilder.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Util/OpenStringBuilder.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using J2N.Text;
+using Lucene.Net.Support;
 using System;
 using System.Diagnostics.CodeAnalysis;
 using System.Text;
@@ -187,7 +188,7 @@ namespace Lucene.Net.Analysis.Util
 
         public virtual void UnsafeWrite(char[] b, int off, int len)
         {
-            System.Array.Copy(b, off, m_buf, this.m_len, len);
+            Arrays.Copy(b, off, m_buf, this.m_len, len);
             this.m_len += len;
         }
 
@@ -235,7 +236,7 @@ namespace Lucene.Net.Analysis.Util
         protected virtual void Resize(int len)
         {
             char[] newbuf = new char[Math.Max(m_buf.Length << 1, len)];
-            System.Array.Copy(m_buf, 0, newbuf, 0, Length);
+            Arrays.Copy(m_buf, 0, newbuf, 0, Length);
             m_buf = newbuf;
         }
 
@@ -303,7 +304,7 @@ namespace Lucene.Net.Analysis.Util
         public virtual char[] ToCharArray()
         {
             char[] newbuf = new char[Length];
-            System.Array.Copy(m_buf, 0, newbuf, 0, Length);
+            Arrays.Copy(m_buf, 0, newbuf, 0, Length);
             return newbuf;
         }
 
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Util/RollingCharBuffer.cs b/src/Lucene.Net.Analysis.Common/Analysis/Util/RollingCharBuffer.cs
index 453d4d3c7..fc4b4ec9a 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Util/RollingCharBuffer.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Util/RollingCharBuffer.cs
@@ -1,5 +1,6 @@
-// Lucene version compatibility level 4.8.1
+// Lucene version compatibility level 4.8.1
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
 using System.Diagnostics;
@@ -83,8 +84,8 @@ namespace Lucene.Net.Analysis.Util
                     // Grow
                     var newBuffer = new char[ArrayUtil.Oversize(1 + count, RamUsageEstimator.NUM_BYTES_CHAR)];
                     //System.out.println(Thread.currentThread().getName() + ": cb grow " + newBuffer.length);
-                    Array.Copy(buffer, nextWrite, newBuffer, 0, buffer.Length - nextWrite);
-                    Array.Copy(buffer, 0, newBuffer, buffer.Length - nextWrite, nextWrite);
+                    Arrays.Copy(buffer, nextWrite, newBuffer, 0, buffer.Length - nextWrite);
+                    Arrays.Copy(buffer, 0, newBuffer, buffer.Length - nextWrite, nextWrite);
                     nextWrite = buffer.Length;
                     buffer = newBuffer;
                 }
@@ -155,14 +156,14 @@ namespace Lucene.Net.Analysis.Util
             var result = new char[length];
             if (endIndex >= startIndex && length < buffer.Length)
             {
-                Array.Copy(buffer, startIndex, result, 0, endIndex - startIndex);
+                Arrays.Copy(buffer, startIndex, result, 0, endIndex - startIndex);
             }
             else
             {
                 // Wrapped:
                 int part1 = buffer.Length - startIndex;
-                Array.Copy(buffer, startIndex, result, 0, part1);
-                Array.Copy(buffer, 0, result, buffer.Length - startIndex, length - part1);
+                Arrays.Copy(buffer, startIndex, result, 0, part1);
+                Arrays.Copy(buffer, 0, result, buffer.Length - startIndex, length - part1);
             }
             return result;
         }
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Util/SegmentingTokenizerBase.cs b/src/Lucene.Net.Analysis.Common/Analysis/Util/SegmentingTokenizerBase.cs
index 576a0c473..e0444b142 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Util/SegmentingTokenizerBase.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Util/SegmentingTokenizerBase.cs
@@ -3,6 +3,7 @@
 using ICU4N.Text;
 using Lucene.Net.Analysis.TokenAttributes;
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Diagnostics;
 using System.IO;
@@ -155,7 +156,7 @@ namespace Lucene.Net.Analysis.Util
         {
             m_offset += usableLength;
             int leftover = length - usableLength;
-            Array.Copy(m_buffer, usableLength, m_buffer, 0, leftover);
+            Arrays.Copy(m_buffer, usableLength, m_buffer, 0, leftover);
             int requested = m_buffer.Length - leftover;
             int returned = Read(m_input, m_buffer, leftover, requested);
             length = returned < 0 ? leftover : returned + leftover;
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Util/StemmerUtil.cs b/src/Lucene.Net.Analysis.Common/Analysis/Util/StemmerUtil.cs
index e14c3d2fb..f4b6ddce6 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Util/StemmerUtil.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Util/StemmerUtil.cs
@@ -1,5 +1,6 @@
-// Lucene version compatibility level 4.8.1
+// Lucene version compatibility level 4.8.1
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Diagnostics;
 
@@ -115,7 +116,7 @@ namespace Lucene.Net.Analysis.Util
             if (Debugging.AssertsEnabled) Debugging.Assert(pos < len);
             if (pos < len - 1) // don't arraycopy if asked to delete last character
             {
-                Array.Copy(s, pos + 1, s, pos, len - pos - 1);
+                Arrays.Copy(s, pos + 1, s, pos, len - pos - 1);
             }
             return len - 1;
         }
@@ -133,7 +134,7 @@ namespace Lucene.Net.Analysis.Util
             if (Debugging.AssertsEnabled) Debugging.Assert(pos + nChars <= len);
             if (pos + nChars < len) // don't arraycopy if asked to delete the last characters
             {
-                Array.Copy(s, pos + nChars, s, pos, len - pos - nChars);
+                Arrays.Copy(s, pos + nChars, s, pos, len - pos - nChars);
             }
             return len - nChars;
         }
diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Wikipedia/WikipediaTokenizerImpl.cs b/src/Lucene.Net.Analysis.Common/Analysis/Wikipedia/WikipediaTokenizerImpl.cs
index f7e6fd4a3..640d33ac2 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Wikipedia/WikipediaTokenizerImpl.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Wikipedia/WikipediaTokenizerImpl.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Support;
 using System;
 using System.IO;
 using System.Text;
@@ -554,7 +555,7 @@ namespace Lucene.Net.Analysis.Wikipedia
             /* first: make room (if you can) */
             if (zzStartRead > 0)
             {
-                System.Array.Copy(zzBuffer, zzStartRead,
+                Arrays.Copy(zzBuffer, zzStartRead,
                                  zzBuffer, 0,
                                  zzEndRead - zzStartRead);
 
@@ -570,7 +571,7 @@ namespace Lucene.Net.Analysis.Wikipedia
             {
                 /* if not: blow it up */
                 char[] newBuffer = new char[zzCurrentPos * 2];
-                System.Array.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
+                Arrays.Copy(zzBuffer, 0, newBuffer, 0, zzBuffer.Length);
                 zzBuffer = newBuffer;
             }
 
diff --git a/src/Lucene.Net.Analysis.Common/Collation/CollationKeyFilter.cs b/src/Lucene.Net.Analysis.Common/Collation/CollationKeyFilter.cs
index c18c8cd15..6639ca2a4 100644
--- a/src/Lucene.Net.Analysis.Common/Collation/CollationKeyFilter.cs
+++ b/src/Lucene.Net.Analysis.Common/Collation/CollationKeyFilter.cs
@@ -1,8 +1,9 @@
-// Lucene version compatibility level 4.8.1
+// Lucene version compatibility level 4.8.1
 #if FEATURE_COLLATION
 using Icu.Collation;
 using Lucene.Net.Analysis;
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
 
@@ -110,14 +111,14 @@ namespace Lucene.Net.Collation
         internal static byte[] ToByteArray(this sbyte[] arr)
         {
             var unsigned = new byte[arr.Length];
-            System.Buffer.BlockCopy(arr, 0, unsigned, 0, arr.Length);
+            Arrays.Copy(arr, 0, unsigned, 0, arr.Length);
             return unsigned;
         }
 
         internal static sbyte[] ToSByteArray(this byte[] arr)
         {
             var unsigned = new sbyte[arr.Length];
-            System.Buffer.BlockCopy(arr, 0, unsigned, 0, arr.Length);
+            Arrays.Copy(arr, 0, unsigned, 0, arr.Length);
             return unsigned;
         }
     }
diff --git a/src/Lucene.Net.Analysis.Common/Tartarus/Snowball/SnowballProgram.cs b/src/Lucene.Net.Analysis.Common/Tartarus/Snowball/SnowballProgram.cs
index b8d325a14..2fa7b773e 100644
--- a/src/Lucene.Net.Analysis.Common/Tartarus/Snowball/SnowballProgram.cs
+++ b/src/Lucene.Net.Analysis.Common/Tartarus/Snowball/SnowballProgram.cs
@@ -418,14 +418,14 @@ namespace Lucene.Net.Tartarus.Snowball
             if (newLength > m_current.Length)
             {
                 char[] newBuffer = new char[ArrayUtil.Oversize(newLength, RamUsageEstimator.NUM_BYTES_CHAR)];
-                System.Array.Copy(m_current, 0, newBuffer, 0, m_limit);
+                Arrays.Copy(m_current, 0, newBuffer, 0, m_limit);
                 m_current = newBuffer;
             }
             // if the substring being replaced is longer or shorter than the
             // replacement, need to shift things around
             if (adjustment != 0 && c_ket < m_limit)
             {
-                System.Array.Copy(m_current, c_ket, m_current, c_bra + s.Length,
+                Arrays.Copy(m_current, c_ket, m_current, c_bra + s.Length,
                     m_limit - c_ket);
             }
             // insert the replacement text
diff --git a/src/Lucene.Net.Analysis.ICU/Analysis/Icu/ICUTransformFilter.cs b/src/Lucene.Net.Analysis.ICU/Analysis/Icu/ICUTransformFilter.cs
index 7a3e2c1f7..4ff71f800 100644
--- a/src/Lucene.Net.Analysis.ICU/Analysis/Icu/ICUTransformFilter.cs
+++ b/src/Lucene.Net.Analysis.ICU/Analysis/Icu/ICUTransformFilter.cs
@@ -141,7 +141,7 @@ namespace Lucene.Net.Analysis.Icu
 
             public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count)
             {
-                System.Array.Copy(buffer, sourceIndex, destination, destinationIndex, count);
+                Arrays.Copy(buffer, sourceIndex, destination, destinationIndex, count);
             }
 
             public bool HasMetaData => false;
@@ -163,7 +163,7 @@ namespace Lucene.Net.Analysis.Icu
                 // shift text if necessary for the replacement
                 int newLength = ShiftForReplace(start, length + start, charsLen); // LUCENENET: Changed 2nd parameter to calculate limit
                 // insert the replacement text
-                System.Array.Copy(text, charsStart, buffer, start, charsLen);
+                Arrays.Copy(text, charsStart, buffer, start, charsLen);
                 token.Length = (this.length = newLength);
             }
 
@@ -178,7 +178,7 @@ namespace Lucene.Net.Analysis.Icu
                 // if the substring being replaced is longer or shorter than the
                 // replacement, need to shift things around
                 if (replacementLength != charsLen && limit < length)
-                    System.Array.Copy(buffer, limit, buffer, start + charsLen, length - limit);
+                    Arrays.Copy(buffer, limit, buffer, start + charsLen, length - limit);
                 return newLength;
             }
         }
diff --git a/src/Lucene.Net.Analysis.ICU/Analysis/Icu/Segmentation/ICUTokenizer.cs b/src/Lucene.Net.Analysis.ICU/Analysis/Icu/Segmentation/ICUTokenizer.cs
index ab7976060..38ebf28d9 100644
--- a/src/Lucene.Net.Analysis.ICU/Analysis/Icu/Segmentation/ICUTokenizer.cs
+++ b/src/Lucene.Net.Analysis.ICU/Analysis/Icu/Segmentation/ICUTokenizer.cs
@@ -190,7 +190,7 @@ namespace Lucene.Net.Analysis.Icu.Segmentation
         {
             offset += usableLength;
             int leftover = length - usableLength;
-            System.Array.Copy(buffer, usableLength, buffer, 0, leftover);
+            Arrays.Copy(buffer, usableLength, buffer, 0, leftover);
             int requested = buffer.Length - leftover;
             int returned = Read(m_input, buffer, leftover, requested);
             length = returned + leftover;
diff --git a/src/Lucene.Net.Analysis.Kuromoji/Dict/BinaryDictionary.cs b/src/Lucene.Net.Analysis.Kuromoji/Dict/BinaryDictionary.cs
index d18f3535c..965a6da59 100644
--- a/src/Lucene.Net.Analysis.Kuromoji/Dict/BinaryDictionary.cs
+++ b/src/Lucene.Net.Analysis.Kuromoji/Dict/BinaryDictionary.cs
@@ -3,6 +3,7 @@ using J2N.IO;
 using J2N.Numerics;
 using Lucene.Net.Codecs;
 using Lucene.Net.Store;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
 using System.IO;
@@ -239,7 +240,7 @@ namespace Lucene.Net.Analysis.Ja.Dict
                 int prefix = data.TripleShift(4);
                 int suffix = data & 0xF;
                 char[] text = new char[prefix + suffix];
-                System.Array.Copy(surfaceForm, off, text, 0, prefix);
+                Arrays.Copy(surfaceForm, off, text, 0, prefix);
                 for (int i = 0; i < suffix; i++)
                 {
                     text[prefix + i] = buffer.GetChar(offset + (i << 1));
diff --git a/src/Lucene.Net.Analysis.Kuromoji/JapaneseTokenizer.cs b/src/Lucene.Net.Analysis.Kuromoji/JapaneseTokenizer.cs
index b1ad11018..b4a68db39 100644
--- a/src/Lucene.Net.Analysis.Kuromoji/JapaneseTokenizer.cs
+++ b/src/Lucene.Net.Analysis.Kuromoji/JapaneseTokenizer.cs
@@ -1301,7 +1301,7 @@ namespace Lucene.Net.Analysis.Ja
             // ArrayUtil.grow will otherwise pick a different
             // length than the int[]s we just grew:
             JapaneseTokenizerType[] newBackType = new JapaneseTokenizerType[backID.Length];
-            System.Array.Copy(backType, 0, newBackType, 0, backType.Length);
+            Arrays.Copy(backType, 0, newBackType, 0, backType.Length);
             backType = newBackType;
         }
 
@@ -1315,7 +1315,7 @@ namespace Lucene.Net.Analysis.Ja
             // ArrayUtil.grow will otherwise pick a different
             // length than the int[]s we just grew:
             JapaneseTokenizerType[] newForwardType = new JapaneseTokenizerType[forwardPos.Length];
-            System.Array.Copy(forwardType, 0, newForwardType, 0, forwardType.Length);
+            Arrays.Copy(forwardType, 0, newForwardType, 0, forwardType.Length);
             forwardType = newForwardType;
         }
 
@@ -1422,8 +1422,8 @@ namespace Lucene.Net.Analysis.Ja
                 {
                     Position[] newPositions = new Position[ArrayUtil.Oversize(1 + count, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
                     //System.out.println("grow positions " + newPositions.length);
-                    System.Array.Copy(positions, nextWrite, newPositions, 0, positions.Length - nextWrite);
-                    System.Array.Copy(positions, 0, newPositions, positions.Length - nextWrite, nextWrite);
+                    Arrays.Copy(positions, nextWrite, newPositions, 0, positions.Length - nextWrite);
+                    Arrays.Copy(positions, 0, newPositions, positions.Length - nextWrite, nextWrite);
                     for (int i = positions.Length; i < newPositions.Length; i++)
                     {
                         newPositions[i] = new Position();
diff --git a/src/Lucene.Net.Analysis.Phonetic/Language/ColognePhonetic.cs b/src/Lucene.Net.Analysis.Phonetic/Language/ColognePhonetic.cs
index a84104e97..ea4f2ad6e 100644
--- a/src/Lucene.Net.Analysis.Phonetic/Language/ColognePhonetic.cs
+++ b/src/Lucene.Net.Analysis.Phonetic/Language/ColognePhonetic.cs
@@ -1,4 +1,5 @@
 // commons-codec version compatibility level: 1.9
+using Lucene.Net.Support;
 using System;
 using System.Globalization;
 
@@ -231,7 +232,7 @@ namespace Lucene.Net.Analysis.Phonetic.Language
             protected override char[] CopyData(int start, int length)
             {
                 char[] newData = new char[length];
-                System.Array.Copy(m_data, start, newData, 0, length);
+                Arrays.Copy(m_data, start, newData, 0, length);
                 return newData;
             }
         }
@@ -252,7 +253,7 @@ namespace Lucene.Net.Analysis.Phonetic.Language
             protected override char[] CopyData(int start, int length)
             {
                 char[] newData = new char[length];
-                System.Array.Copy(m_data, m_data.Length - this.m_length + start, newData, 0, length);
+                Arrays.Copy(m_data, m_data.Length - this.m_length + start, newData, 0, length);
                 return newData;
             }
 
diff --git a/src/Lucene.Net.Analysis.Phonetic/Language/Nysiis.cs b/src/Lucene.Net.Analysis.Phonetic/Language/Nysiis.cs
index 78bf36d5d..b5a436564 100644
--- a/src/Lucene.Net.Analysis.Phonetic/Language/Nysiis.cs
+++ b/src/Lucene.Net.Analysis.Phonetic/Language/Nysiis.cs
@@ -1,4 +1,5 @@
 // commons-codec version compatibility level: 1.9
+using Lucene.Net.Support;
 using System;
 using System.Text;
 using System.Text.RegularExpressions;
@@ -299,7 +300,7 @@ namespace Lucene.Net.Analysis.Phonetic.Language
                 char next = i < len - 1 ? chars[i + 1] : SPACE;
                 char aNext = i < len - 2 ? chars[i + 2] : SPACE;
                 char[] transcoded = TranscodeRemaining(chars[i - 1], chars[i], next, aNext);
-                System.Array.Copy(transcoded, 0, chars, i, transcoded.Length);
+                Arrays.Copy(transcoded, 0, chars, i, transcoded.Length);
 
                 // only append the current char to the key if it is different from the last one
                 if (chars[i] != chars[i - 1])
diff --git a/src/Lucene.Net.Analysis.Phonetic/Language/RefinedSoundex.cs b/src/Lucene.Net.Analysis.Phonetic/Language/RefinedSoundex.cs
index 1993a13bc..4bf0a0aad 100644
--- a/src/Lucene.Net.Analysis.Phonetic/Language/RefinedSoundex.cs
+++ b/src/Lucene.Net.Analysis.Phonetic/Language/RefinedSoundex.cs
@@ -1,4 +1,5 @@
 // commons-codec version compatibility level: 1.9
+using Lucene.Net.Support;
 using System.Globalization;
 using System.Text;
 
@@ -73,7 +74,7 @@ namespace Lucene.Net.Analysis.Phonetic.Language
         public RefinedSoundex(char[] mapping)
         {
             this.soundexMapping = new char[mapping.Length];
-            System.Array.Copy(mapping, 0, this.soundexMapping, 0, mapping.Length);
+            Arrays.Copy(mapping, 0, this.soundexMapping, 0, mapping.Length);
         }
 
         /// <summary>
diff --git a/src/Lucene.Net.Analysis.Phonetic/Language/Soundex.cs b/src/Lucene.Net.Analysis.Phonetic/Language/Soundex.cs
index 6fa322eb5..92a68b5f2 100644
--- a/src/Lucene.Net.Analysis.Phonetic/Language/Soundex.cs
+++ b/src/Lucene.Net.Analysis.Phonetic/Language/Soundex.cs
@@ -1,4 +1,5 @@
 // commons-codec version compatibility level: 1.10
+using Lucene.Net.Support;
 using System;
 
 namespace Lucene.Net.Analysis.Phonetic.Language
@@ -149,7 +150,7 @@ namespace Lucene.Net.Analysis.Phonetic.Language
         public Soundex(char[] mapping)
         {
             this.soundexMapping = new char[mapping.Length];
-            System.Array.Copy(mapping, 0, this.soundexMapping, 0, mapping.Length);
+            Arrays.Copy(mapping, 0, this.soundexMapping, 0, mapping.Length);
             this.specialCaseHW = !HasMarker(this.soundexMapping);
         }
 
diff --git a/src/Lucene.Net.Analysis.SmartCn/Hhmm/BiSegGraph.cs b/src/Lucene.Net.Analysis.SmartCn/Hhmm/BiSegGraph.cs
index 02ca235b8..fb4277a36 100644
--- a/src/Lucene.Net.Analysis.SmartCn/Hhmm/BiSegGraph.cs
+++ b/src/Lucene.Net.Analysis.SmartCn/Hhmm/BiSegGraph.cs
@@ -95,9 +95,9 @@ namespace Lucene.Net.Analysis.Cn.Smart.Hhmm
                         foreach (SegToken t2 in nextTokens)
                         {
                             idBuffer = new char[t1.CharArray.Length + t2.CharArray.Length + 1];
-                            System.Array.Copy(t1.CharArray, 0, idBuffer, 0, t1.CharArray.Length);
+                            Arrays.Copy(t1.CharArray, 0, idBuffer, 0, t1.CharArray.Length);
                             idBuffer[t1.CharArray.Length] = BigramDictionary.WORD_SEGMENT_CHAR;
-                            System.Array.Copy(t2.CharArray, 0, idBuffer,
+                            Arrays.Copy(t2.CharArray, 0, idBuffer,
                                 t1.CharArray.Length + 1, t2.CharArray.Length);
 
                             // Two linked Words frequency
diff --git a/src/Lucene.Net.Analysis.SmartCn/Hhmm/WordDictionary.cs b/src/Lucene.Net.Analysis.SmartCn/Hhmm/WordDictionary.cs
index 80cf4a79d..cb609ff1c 100644
--- a/src/Lucene.Net.Analysis.SmartCn/Hhmm/WordDictionary.cs
+++ b/src/Lucene.Net.Analysis.SmartCn/Hhmm/WordDictionary.cs
@@ -1,6 +1,7 @@
 // lucene version compatibility level: 4.8.1
 using J2N;
 using J2N.IO;
+using Lucene.Net.Support;
 using Lucene.Net.Support.Threading;
 using System;
 using System.IO;
@@ -455,7 +456,7 @@ namespace Lucene.Net.Analysis.Cn.Smart.Hhmm
                         // wordItemTable[j][k] = new WordItem();
                         wordItem_frequencyTable[j][k] = wordItem_frequencyTable[delimiterIndex][i];
                         wordItem_charArrayTable[j][k] = new char[wordItem_charArrayTable[delimiterIndex][i].Length - 1];
-                        System.Array.Copy(wordItem_charArrayTable[delimiterIndex][i], 1,
+                        Arrays.Copy(wordItem_charArrayTable[delimiterIndex][i], 1,
                             wordItem_charArrayTable[j][k], 0,
                             wordItem_charArrayTable[j][k].Length);
                     }
diff --git a/src/Lucene.Net.Benchmark/ByTask/Tasks/SearchWithSortTask.cs b/src/Lucene.Net.Benchmark/ByTask/Tasks/SearchWithSortTask.cs
index fdded57ce..0513025cd 100644
--- a/src/Lucene.Net.Benchmark/ByTask/Tasks/SearchWithSortTask.cs
+++ b/src/Lucene.Net.Benchmark/ByTask/Tasks/SearchWithSortTask.cs
@@ -1,6 +1,7 @@
 using J2N.Text;
 using Lucene.Net.Benchmarks.ByTask.Feeds;
 using Lucene.Net.Search;
+using Lucene.Net.Support;
 using System;
 
 namespace Lucene.Net.Benchmarks.ByTask.Tasks
@@ -96,7 +97,7 @@ namespace Lucene.Net.Benchmarks.ByTask.Tasks
             if (upto < sortFields.Length)
             {
                 SortField[] newSortFields = new SortField[upto];
-                System.Array.Copy(sortFields, 0, newSortFields, 0, upto);
+                Arrays.Copy(sortFields, 0, newSortFields, 0, upto);
                 sortFields = newSortFields;
             }
             this.sort = new Sort(sortFields);
diff --git a/src/Lucene.Net.Benchmark/Support/Sax/Ext/Attributes2Impl.cs b/src/Lucene.Net.Benchmark/Support/Sax/Ext/Attributes2Impl.cs
index c0db09e24..88e231906 100644
--- a/src/Lucene.Net.Benchmark/Support/Sax/Ext/Attributes2Impl.cs
+++ b/src/Lucene.Net.Benchmark/Support/Sax/Ext/Attributes2Impl.cs
@@ -3,6 +3,7 @@
 // Public Domain: no warranty.
 // $Id: Attributes2Impl.java,v 1.5 2004/03/08 13:01:01 dmegginson Exp $
 
+using Lucene.Net.Support;
 using Sax.Helpers;
 using System;
 
@@ -218,11 +219,11 @@ namespace Sax.Ext
                 bool[] newFlags;
 
                 newFlags = new bool[length];
-                System.Array.Copy(declared, 0, newFlags, 0, declared.Length);
+                Arrays.Copy(declared, 0, newFlags, 0, declared.Length);
                 declared = newFlags;
 
                 newFlags = new bool[length];
-                System.Array.Copy(specified, 0, newFlags, 0, specified.Length);
+                Arrays.Copy(specified, 0, newFlags, 0, specified.Length);
                 specified = newFlags;
             }
 
@@ -238,9 +239,9 @@ namespace Sax.Ext
             base.RemoveAttribute(index);
             if (index != origMax)
             {
-                System.Array.Copy(declared, index + 1, declared, index,
+                Arrays.Copy(declared, index + 1, declared, index,
                     origMax - index);
-                System.Array.Copy(specified, index + 1, specified, index,
+                Arrays.Copy(specified, index + 1, specified, index,
                     origMax - index);
             }
         }
diff --git a/src/Lucene.Net.Benchmark/Support/Sax/Helpers/AttributesImpl.cs b/src/Lucene.Net.Benchmark/Support/Sax/Helpers/AttributesImpl.cs
index c3d689c12..5943b36c7 100644
--- a/src/Lucene.Net.Benchmark/Support/Sax/Helpers/AttributesImpl.cs
+++ b/src/Lucene.Net.Benchmark/Support/Sax/Helpers/AttributesImpl.cs
@@ -4,6 +4,7 @@
 // NO WARRANTY!  This class is in the public domain.
 // $Id: AttributesImpl.java,v 1.9 2002/01/30 20:52:24 dbrownell Exp $
 
+using Lucene.Net.Support;
 using System;
 
 namespace Sax.Helpers
@@ -429,7 +430,7 @@ namespace Sax.Helpers
             {
                 if (index < length - 1)
                 {
-                    System.Array.Copy(data, (index + 1) * 5, data, index * 5,
+                    Arrays.Copy(data, (index + 1) * 5, data, index * 5,
                              (length - index - 1) * 5);
                 }
                 index = (length - 1) * 5;
@@ -584,7 +585,7 @@ namespace Sax.Helpers
             string[] newData = new string[max];
             if (length > 0)
             {
-                System.Array.Copy(data, 0, newData, 0, length * 5);
+                Arrays.Copy(data, 0, newData, 0, length * 5);
             }
             data = newData;
         }
diff --git a/src/Lucene.Net.Benchmark/Support/Sax/Helpers/NamespaceSupport.cs b/src/Lucene.Net.Benchmark/Support/Sax/Helpers/NamespaceSupport.cs
index 07ea97a0f..c33ab8e80 100644
--- a/src/Lucene.Net.Benchmark/Support/Sax/Helpers/NamespaceSupport.cs
+++ b/src/Lucene.Net.Benchmark/Support/Sax/Helpers/NamespaceSupport.cs
@@ -165,7 +165,7 @@ namespace Sax.Helpers
             if (contextPos >= max)
             {
                 var newContexts = new Context[max * 2];
-                Array.Copy(contexts, 0, newContexts, 0, max);
+                Arrays.Copy(contexts, 0, newContexts, 0, max);
                 //max *= 2; // LUCENENET: IDE0059: Remove unnecessary value assignment
                 contexts = newContexts;
             }
diff --git a/src/Lucene.Net.Benchmark/Support/TagSoup/HTMLScanner.cs b/src/Lucene.Net.Benchmark/Support/TagSoup/HTMLScanner.cs
index f279a6907..55071b904 100644
--- a/src/Lucene.Net.Benchmark/Support/TagSoup/HTMLScanner.cs
+++ b/src/Lucene.Net.Benchmark/Support/TagSoup/HTMLScanner.cs
@@ -14,6 +14,7 @@
 // 
 
 using Lucene;
+using Lucene.Net.Support;
 using Sax;
 using System;
 using System.IO;
@@ -713,7 +714,7 @@ namespace TagSoup
                 {
                     // Grow the buffer size
                     char[] newOutputBuffer = new char[theOutputBuffer.Length * 2];
-                    Array.Copy(theOutputBuffer, 0, newOutputBuffer, 0, theSize + 1);
+                    Arrays.Copy(theOutputBuffer, 0, newOutputBuffer, 0, theSize + 1);
                     theOutputBuffer = newOutputBuffer;
                 }
             }
diff --git a/src/Lucene.Net.Codecs/BlockTerms/BlockTermsWriter.cs b/src/Lucene.Net.Codecs/BlockTerms/BlockTermsWriter.cs
index abed6e6a0..30c9fb66e 100644
--- a/src/Lucene.Net.Codecs/BlockTerms/BlockTermsWriter.cs
+++ b/src/Lucene.Net.Codecs/BlockTerms/BlockTermsWriter.cs
@@ -2,6 +2,7 @@
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
@@ -259,7 +260,7 @@ namespace Lucene.Net.Codecs.BlockTerms
                 if (pendingTerms.Length == pendingCount)
                 {
                     TermEntry[] newArray = new TermEntry[ArrayUtil.Oversize(pendingCount + 1, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                    System.Array.Copy(pendingTerms, 0, newArray, 0, pendingCount);
+                    Arrays.Copy(pendingTerms, 0, newArray, 0, pendingCount);
                     for (int i = pendingCount; i < newArray.Length; i++)
                     {
                         newArray[i] = new TermEntry();
diff --git a/src/Lucene.Net.Codecs/Memory/DirectPostingsFormat.cs b/src/Lucene.Net.Codecs/Memory/DirectPostingsFormat.cs
index f995efa4b..dcf950343 100644
--- a/src/Lucene.Net.Codecs/Memory/DirectPostingsFormat.cs
+++ b/src/Lucene.Net.Codecs/Memory/DirectPostingsFormat.cs
@@ -362,7 +362,7 @@ namespace Lucene.Net.Codecs.Memory
                 public int[] Get()
                 {
                     var arr = new int[upto];
-                    Array.Copy(ints, 0, arr, 0, upto);
+                    Arrays.Copy(ints, 0, arr, 0, upto);
                     upto = 0;
                     return arr;
                 }
@@ -425,7 +425,7 @@ namespace Lucene.Net.Codecs.Memory
                     {
                         termBytes = ArrayUtil.Grow(termBytes, termOffset + term.Length);
                     }
-                    Array.Copy(term.Bytes, term.Offset, termBytes, termOffset, term.Length);
+                    Arrays.Copy(term.Bytes, term.Offset, termBytes, termOffset, term.Length);
                     termOffset += term.Length;
                     termOffsets[count + 1] = termOffset;
 
@@ -574,7 +574,7 @@ namespace Lucene.Net.Codecs.Memory
                                             if (payload != null)
                                             {
                                                 var payloadBytes = new byte[payload.Length];
-                                                Array.Copy(payload.Bytes, payload.Offset, payloadBytes, 0,
+                                                Arrays.Copy(payload.Bytes, payload.Offset, payloadBytes, 0,
                                                     payload.Length);
                                                 payloads[upto][pos] = payloadBytes;
                                             }
@@ -608,7 +608,7 @@ namespace Lucene.Net.Codecs.Memory
                 //System.out.println(skipCount + " skips: " + field);
 
                 this.termBytes = new byte[termOffset];
-                Array.Copy(termBytes, 0, this.termBytes, 0, termOffset);
+                Arrays.Copy(termBytes, 0, this.termBytes, 0, termOffset);
 
                 // Pack skips:
                 this.skips = new int[skipCount];
@@ -621,7 +621,7 @@ namespace Lucene.Net.Codecs.Memory
                     skipOffsets[i] = skipOffset;
                     if (termSkips != null)
                     {
-                        Array.Copy(termSkips, 0, skips, skipOffset, termSkips.Length);
+                        Arrays.Copy(termSkips, 0, skips, skipOffset, termSkips.Length);
                         skipOffset += termSkips.Length;
                         terms[i].Skips = null;
                     }
@@ -786,7 +786,7 @@ namespace Lucene.Net.Codecs.Memory
                     // we can grow by only 1 and still have amortized
                     // linear time:
                     int[] newSkips = new int[term.Skips.Length + 1];
-                    Array.Copy(term.Skips, 0, newSkips, 0, term.Skips.Length);
+                    Arrays.Copy(term.Skips, 0, newSkips, 0, term.Skips.Length);
                     term.Skips = newSkips;
                     term.Skips[term.Skips.Length - 1] = ord;
                 }
@@ -1345,7 +1345,7 @@ namespace Lucene.Net.Codecs.Memory
                     if (states.Length == 1 + stateUpto)
                     {
                         State[] newStates = new State[states.Length + 1];
-                        Array.Copy(states, 0, newStates, 0, states.Length);
+                        Arrays.Copy(states, 0, newStates, 0, states.Length);
                         newStates[states.Length] = new State();
                         states = newStates;
                     }
diff --git a/src/Lucene.Net.Codecs/Memory/FSTOrdTermsReader.cs b/src/Lucene.Net.Codecs/Memory/FSTOrdTermsReader.cs
index e080192ca..11eec666c 100644
--- a/src/Lucene.Net.Codecs/Memory/FSTOrdTermsReader.cs
+++ b/src/Lucene.Net.Codecs/Memory/FSTOrdTermsReader.cs
@@ -880,7 +880,7 @@ namespace Lucene.Net.Codecs.Memory
                     if (level + 1 == stack.Length)
                     {
                         var temp = new Frame[ArrayUtil.Oversize(level + 2, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                        Array.Copy(stack, 0, temp, 0, stack.Length);
+                        Arrays.Copy(stack, 0, temp, 0, stack.Length);
                         for (int i = stack.Length; i < temp.Length; i++)
                         {
                             temp[i] = new Frame();
diff --git a/src/Lucene.Net.Codecs/Memory/FSTOrdTermsWriter.cs b/src/Lucene.Net.Codecs/Memory/FSTOrdTermsWriter.cs
index 39d3cac17..6b8842157 100644
--- a/src/Lucene.Net.Codecs/Memory/FSTOrdTermsWriter.cs
+++ b/src/Lucene.Net.Codecs/Memory/FSTOrdTermsWriter.cs
@@ -1,4 +1,5 @@
-using Lucene.Net.Util.Fst;
+using Lucene.Net.Support;
+using Lucene.Net.Util.Fst;
 using System;
 using System.Collections.Generic;
 using JCG = J2N.Collections.Generic;
@@ -405,7 +406,7 @@ namespace Lucene.Net.Codecs.Memory
                 _lastBlockStatsFp = _statsOut.Position; // LUCENENET specific: Renamed from getFilePointer() to match FileStream
                 _lastBlockMetaLongsFp = _metaLongsOut.Position; // LUCENENET specific: Renamed from getFilePointer() to match FileStream
                 _lastBlockMetaBytesFp = _metaBytesOut.Position; // LUCENENET specific: Renamed from getFilePointer() to match FileStream
-                Array.Copy(_lastLongs, 0, _lastBlockLongs, 0, _longsSize);
+                Arrays.Copy(_lastLongs, 0, _lastBlockLongs, 0, _longsSize);
             }
         }
     }
diff --git a/src/Lucene.Net.Codecs/Memory/FSTTermsReader.cs b/src/Lucene.Net.Codecs/Memory/FSTTermsReader.cs
index eaff0bb3c..44745aa48 100644
--- a/src/Lucene.Net.Codecs/Memory/FSTTermsReader.cs
+++ b/src/Lucene.Net.Codecs/Memory/FSTTermsReader.cs
@@ -1,5 +1,6 @@
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
+using Lucene.Net.Support;
 using Lucene.Net.Util.Fst;
 using System;
 using System.Collections.Generic;
@@ -795,7 +796,7 @@ namespace Lucene.Net.Codecs.Memory
                     if (level + 1 == stack.Length)
                     {
                         Frame[] temp = new Frame[ArrayUtil.Oversize(level + 2, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                        Array.Copy(stack, 0, temp, 0, stack.Length);
+                        Arrays.Copy(stack, 0, temp, 0, stack.Length);
                         for (int i = stack.Length; i < temp.Length; i++)
                         {
                             temp[i] = new Frame();
diff --git a/src/Lucene.Net.Codecs/Memory/MemoryPostingsFormat.cs b/src/Lucene.Net.Codecs/Memory/MemoryPostingsFormat.cs
index 188c04f57..3688527ce 100644
--- a/src/Lucene.Net.Codecs/Memory/MemoryPostingsFormat.cs
+++ b/src/Lucene.Net.Codecs/Memory/MemoryPostingsFormat.cs
@@ -1,6 +1,7 @@
 using J2N.Numerics;
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
+using Lucene.Net.Support;
 using Lucene.Net.Util.Fst;
 using System;
 using System.Collections.Generic;
@@ -410,7 +411,7 @@ namespace Lucene.Net.Codecs.Memory
                     buffer = ArrayUtil.Grow(buffer, bufferIn.Length);
                 }
                 @in.Reset(buffer, 0, bufferIn.Length);
-                Array.Copy(bufferIn.Bytes, bufferIn.Offset, buffer, 0, bufferIn.Length);
+                Arrays.Copy(bufferIn.Bytes, bufferIn.Offset, buffer, 0, bufferIn.Length);
                 this.liveDocs = liveDocs;
                 docID = -1;
                 accum = 0;
@@ -569,7 +570,7 @@ namespace Lucene.Net.Codecs.Memory
                     buffer = ArrayUtil.Grow(buffer, bufferIn.Length);
                 }
                 @in.Reset(buffer, 0, bufferIn.Length - bufferIn.Offset);
-                Array.Copy(bufferIn.Bytes, bufferIn.Offset, buffer, 0, bufferIn.Length);
+                Arrays.Copy(bufferIn.Bytes, bufferIn.Offset, buffer, 0, bufferIn.Length);
                 this.liveDocs = liveDocs;
                 docID = -1;
                 accum = 0;
diff --git a/src/Lucene.Net.Codecs/Pulsing/PulsingPostingsReader.cs b/src/Lucene.Net.Codecs/Pulsing/PulsingPostingsReader.cs
index 5665ec6f3..3fd236ae0 100644
--- a/src/Lucene.Net.Codecs/Pulsing/PulsingPostingsReader.cs
+++ b/src/Lucene.Net.Codecs/Pulsing/PulsingPostingsReader.cs
@@ -119,7 +119,7 @@ namespace Lucene.Net.Codecs.Pulsing
                 if (PostingsSize != -1)
                 {
                     clone.Postings = new byte[PostingsSize];
-                    Array.Copy(Postings, 0, clone.Postings, 0, PostingsSize);
+                    Arrays.Copy(Postings, 0, clone.Postings, 0, PostingsSize);
                 }
                 else
                 {
@@ -130,7 +130,7 @@ namespace Lucene.Net.Codecs.Pulsing
                     if (Int64s is null) return clone;
 
                     clone.Int64s = new long[Int64s.Length];
-                    Array.Copy(Int64s, 0, clone.Int64s, 0, Int64s.Length);
+                    Arrays.Copy(Int64s, 0, clone.Int64s, 0, Int64s.Length);
                 }
                 return clone;
             }
@@ -146,7 +146,7 @@ namespace Lucene.Net.Codecs.Pulsing
                     {
                         Postings = new byte[ArrayUtil.Oversize(_other.PostingsSize, 1)];
                     }
-                    Array.Copy(_other.Postings, 0, Postings, 0, _other.PostingsSize);
+                    Arrays.Copy(_other.Postings, 0, Postings, 0, _other.PostingsSize);
                 }
                 else
                 {
@@ -351,7 +351,7 @@ namespace Lucene.Net.Codecs.Pulsing
                 {
                     _postingsBytes = ArrayUtil.Grow(_postingsBytes, termState.PostingsSize);
                 }
-                System.Array.Copy(termState.Postings, 0, _postingsBytes, 0, termState.PostingsSize);
+                Arrays.Copy(termState.Postings, 0, _postingsBytes, 0, termState.PostingsSize);
                 _postings.Reset(_postingsBytes, 0, termState.PostingsSize);
                 _docId = -1;
                 _accum = 0;
@@ -494,7 +494,7 @@ namespace Lucene.Net.Codecs.Pulsing
                     _postingsBytes = ArrayUtil.Grow(_postingsBytes, termState.PostingsSize);
                 }
 
-                Array.Copy(termState.Postings, 0, _postingsBytes, 0, termState.PostingsSize);
+                Arrays.Copy(termState.Postings, 0, _postingsBytes, 0, termState.PostingsSize);
                 _postings.Reset(_postingsBytes, 0, termState.PostingsSize);
                 this._liveDocs = liveDocs;
                 _payloadLength = 0;
diff --git a/src/Lucene.Net.Codecs/SimpleText/SimpleTextFieldsReader.cs b/src/Lucene.Net.Codecs/SimpleText/SimpleTextFieldsReader.cs
index 9386d7a25..d84ed24ad 100644
--- a/src/Lucene.Net.Codecs/SimpleText/SimpleTextFieldsReader.cs
+++ b/src/Lucene.Net.Codecs/SimpleText/SimpleTextFieldsReader.cs
@@ -1,5 +1,6 @@
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
+using Lucene.Net.Support;
 using Lucene.Net.Support.Threading;
 using Lucene.Net.Util;
 using Lucene.Net.Util.Fst;
@@ -508,7 +509,7 @@ namespace Lucene.Net.Codecs.SimpleText
                     {
                         scratch2.Grow(len);
                     }
-                    System.Array.Copy(scratch.Bytes, SimpleTextFieldsWriter.PAYLOAD.Length, scratch2.Bytes, 0, len);
+                    Arrays.Copy(scratch.Bytes, SimpleTextFieldsWriter.PAYLOAD.Length, scratch2.Bytes, 0, len);
                     scratch2.Length = len;
                     payload = scratch2;
                 }
@@ -620,7 +621,7 @@ namespace Lucene.Net.Codecs.SimpleText
                         {
                             lastTerm.Grow(len);
                         }
-                        System.Array.Copy(scratch.Bytes, SimpleTextFieldsWriter.TERM.Length, lastTerm.Bytes, 0, len);
+                        Arrays.Copy(scratch.Bytes, SimpleTextFieldsWriter.TERM.Length, lastTerm.Bytes, 0, len);
                         lastTerm.Length = len;
                         docFreq = 0;
                         sumTotalTermFreq += totalTermFreq;
diff --git a/src/Lucene.Net.Codecs/SimpleText/SimpleTextStoredFieldsReader.cs b/src/Lucene.Net.Codecs/SimpleText/SimpleTextStoredFieldsReader.cs
index 4fd3999a4..fb77ea7b0 100644
--- a/src/Lucene.Net.Codecs/SimpleText/SimpleTextStoredFieldsReader.cs
+++ b/src/Lucene.Net.Codecs/SimpleText/SimpleTextStoredFieldsReader.cs
@@ -1,5 +1,6 @@
 using J2N.Globalization;
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Globalization;
 using System.Text;
@@ -193,7 +194,7 @@ namespace Lucene.Net.Codecs.SimpleText
             else if (Equals(type, SimpleTextStoredFieldsWriter.TYPE_BINARY))
             {
                 var copy = new byte[_scratch.Length - SimpleTextStoredFieldsWriter.VALUE.Length];
-                Array.Copy(_scratch.Bytes, _scratch.Offset + SimpleTextStoredFieldsWriter.VALUE.Length, copy, 0, copy.Length);
+                Arrays.Copy(_scratch.Bytes, _scratch.Offset + SimpleTextStoredFieldsWriter.VALUE.Length, copy, 0, copy.Length);
                 visitor.BinaryField(fieldInfo, copy);
             }
             else if (Equals(type, SimpleTextStoredFieldsWriter.TYPE_INT))
diff --git a/src/Lucene.Net.Codecs/SimpleText/SimpleTextTermVectorsReader.cs b/src/Lucene.Net.Codecs/SimpleText/SimpleTextTermVectorsReader.cs
index d39a06941..69b327d59 100644
--- a/src/Lucene.Net.Codecs/SimpleText/SimpleTextTermVectorsReader.cs
+++ b/src/Lucene.Net.Codecs/SimpleText/SimpleTextTermVectorsReader.cs
@@ -1,5 +1,6 @@
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 using System.Diagnostics;
@@ -165,7 +166,7 @@ namespace Lucene.Net.Codecs.SimpleText
                     var termLength = _scratch.Length - SimpleTextTermVectorsWriter.TERMTEXT.Length;
                     term.Grow(termLength);
                     term.Length = termLength;
-                    Array.Copy(_scratch.Bytes, _scratch.Offset + SimpleTextTermVectorsWriter.TERMTEXT.Length, term.Bytes, term.Offset, termLength);
+                    Arrays.Copy(_scratch.Bytes, _scratch.Offset + SimpleTextTermVectorsWriter.TERMTEXT.Length, term.Bytes, term.Offset, termLength);
 
                     var postings = new SimpleTVPostings();
                     terms.terms.Add(term, postings);
@@ -209,7 +210,7 @@ namespace Lucene.Net.Codecs.SimpleText
                                 else
                                 {
                                     var payloadBytes = new byte[_scratch.Length - SimpleTextTermVectorsWriter.PAYLOAD.Length];
-                                    Array.Copy(_scratch.Bytes, _scratch.Offset + SimpleTextTermVectorsWriter.PAYLOAD.Length, payloadBytes, 0,
+                                    Arrays.Copy(_scratch.Bytes, _scratch.Offset + SimpleTextTermVectorsWriter.PAYLOAD.Length, payloadBytes, 0,
                                         payloadBytes.Length);
                                     postings.payloads[k] = new BytesRef(payloadBytes);
                                 }
diff --git a/src/Lucene.Net.Facet/FacetsCollector.cs b/src/Lucene.Net.Facet/FacetsCollector.cs
index a5c84ca6a..974de5913 100644
--- a/src/Lucene.Net.Facet/FacetsCollector.cs
+++ b/src/Lucene.Net.Facet/FacetsCollector.cs
@@ -186,7 +186,7 @@ namespace Lucene.Net.Facet
                 if (totalHits >= scores.Length)
                 {
                     float[] newScores = new float[ArrayUtil.Oversize(totalHits + 1, 4)];
-                    Array.Copy(scores, 0, newScores, 0, totalHits);
+                    Arrays.Copy(scores, 0, newScores, 0, totalHits);
                     scores = newScores;
                 }
                 scores[totalHits] = scorer.GetScore();
diff --git a/src/Lucene.Net.Facet/FacetsConfig.cs b/src/Lucene.Net.Facet/FacetsConfig.cs
index dd66e3f3c..b323bd03c 100644
--- a/src/Lucene.Net.Facet/FacetsConfig.cs
+++ b/src/Lucene.Net.Facet/FacetsConfig.cs
@@ -539,7 +539,7 @@ namespace Lucene.Net.Facet
                     {
                         bytes = ArrayUtil.Grow(bytes, upto + field.Assoc.Length);
                     }
-                    Array.Copy(field.Assoc.Bytes, field.Assoc.Offset, bytes, upto, field.Assoc.Length);
+                    Arrays.Copy(field.Assoc.Bytes, field.Assoc.Offset, bytes, upto, field.Assoc.Length);
                     upto += field.Assoc.Length;
 
                     // Drill down:
@@ -641,7 +641,7 @@ namespace Lucene.Net.Facet
         {
             string[] fullPath = new string[1 + path.Length];
             fullPath[0] = dim;
-            Array.Copy(path, 0, fullPath, 1, path.Length);
+            Arrays.Copy(path, 0, fullPath, 1, path.Length);
             return PathToString(fullPath, fullPath.Length);
         }
 
diff --git a/src/Lucene.Net.Facet/RandomSamplingFacetsCollector.cs b/src/Lucene.Net.Facet/RandomSamplingFacetsCollector.cs
index c3d01ae89..dd0e9cfc5 100644
--- a/src/Lucene.Net.Facet/RandomSamplingFacetsCollector.cs
+++ b/src/Lucene.Net.Facet/RandomSamplingFacetsCollector.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using J2N.Numerics;
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 using JCG = J2N.Collections.Generic;
@@ -284,7 +285,7 @@ namespace Lucene.Net.Facet
             string[] childPath = new string[res.Path.Length + 2];
             childPath[0] = res.Dim;
 
-            Array.Copy(res.Path, 0, childPath, 1, res.Path.Length); // reuse
+            Arrays.Copy(res.Path, 0, childPath, 1, res.Path.Length); // reuse
 
             for (int i = 0; i < res.LabelValues.Length; i++)
             {
diff --git a/src/Lucene.Net.Facet/Taxonomy/CachedOrdinalsReader.cs b/src/Lucene.Net.Facet/Taxonomy/CachedOrdinalsReader.cs
index 404ec705c..3d58fadc5 100644
--- a/src/Lucene.Net.Facet/Taxonomy/CachedOrdinalsReader.cs
+++ b/src/Lucene.Net.Facet/Taxonomy/CachedOrdinalsReader.cs
@@ -183,7 +183,7 @@ namespace Lucene.Net.Facet.Taxonomy
                         }
                         ords = ArrayUtil.Grow(ords, (int)nextLength);
                     }
-                    Array.Copy(values.Int32s, 0, ords, (int)totOrds, values.Length);
+                    Arrays.Copy(values.Int32s, 0, ords, (int)totOrds, values.Length);
                     totOrds = nextLength;
                 }
                 Offsets[maxDoc] = (int)totOrds;
@@ -192,7 +192,7 @@ namespace Lucene.Net.Facet.Taxonomy
                 if ((double)totOrds / ords.Length < 0.9)
                 {
                     this.Ordinals = new int[(int)totOrds];
-                    Array.Copy(ords, 0, this.Ordinals, 0, (int)totOrds);
+                    Arrays.Copy(ords, 0, this.Ordinals, 0, (int)totOrds);
                 }
                 else
                 {
diff --git a/src/Lucene.Net.Facet/Taxonomy/Directory/TaxonomyIndexArrays.cs b/src/Lucene.Net.Facet/Taxonomy/Directory/TaxonomyIndexArrays.cs
index dab14bf54..94afa8014 100644
--- a/src/Lucene.Net.Facet/Taxonomy/Directory/TaxonomyIndexArrays.cs
+++ b/src/Lucene.Net.Facet/Taxonomy/Directory/TaxonomyIndexArrays.cs
@@ -86,7 +86,7 @@ namespace Lucene.Net.Facet.Taxonomy.Directory
             // to happen.
             int[] copyParents = copyFrom.Parents;
             this.parents = new int[reader.MaxDoc];
-            Array.Copy(copyParents, 0, parents, 0, copyParents.Length);
+            Arrays.Copy(copyParents, 0, parents, 0, copyParents.Length);
             InitParents(reader, copyParents.Length);
 
             if (copyFrom.initializedChildren)
@@ -106,8 +106,8 @@ namespace Lucene.Net.Facet.Taxonomy.Directory
                     if (copyFrom != null)
                     {
                         // called from the ctor, after we know copyFrom has initialized children/siblings
-                        Array.Copy(copyFrom.Children, 0, children, 0, copyFrom.Children.Length);
-                        Array.Copy(copyFrom.Siblings, 0, siblings, 0, copyFrom.Siblings.Length);
+                        Arrays.Copy(copyFrom.Children, 0, children, 0, copyFrom.Children.Length);
+                        Arrays.Copy(copyFrom.Siblings, 0, siblings, 0, copyFrom.Siblings.Length);
                         ComputeChildrenSiblings(copyFrom.parents.Length);
                     }
                     else
diff --git a/src/Lucene.Net.Facet/Taxonomy/FacetLabel.cs b/src/Lucene.Net.Facet/Taxonomy/FacetLabel.cs
index 0d6343f13..97b316cba 100644
--- a/src/Lucene.Net.Facet/Taxonomy/FacetLabel.cs
+++ b/src/Lucene.Net.Facet/Taxonomy/FacetLabel.cs
@@ -92,7 +92,7 @@ namespace Lucene.Net.Facet.Taxonomy
         {
             Components = new string[1 + path.Length];
             Components[0] = dim;
-            Array.Copy(path, 0, Components, 1, path.Length);
+            Arrays.Copy(path, 0, Components, 1, path.Length);
             Length = Components.Length;
             CheckComponents();
         }
@@ -228,7 +228,7 @@ namespace Lucene.Net.Facet.Taxonomy
                 return "FacetLabel: []";
             }
             string[] parts = new string[Length];
-            Array.Copy(Components, 0, parts, 0, Length);
+            Arrays.Copy(Components, 0, parts, 0, Length);
             return "FacetLabel: " + Arrays.ToString(parts);
         }
 
diff --git a/src/Lucene.Net.Facet/Taxonomy/TaxonomyReader.cs b/src/Lucene.Net.Facet/Taxonomy/TaxonomyReader.cs
index 761edd2c0..09a6f00d0 100644
--- a/src/Lucene.Net.Facet/Taxonomy/TaxonomyReader.cs
+++ b/src/Lucene.Net.Facet/Taxonomy/TaxonomyReader.cs
@@ -1,6 +1,7 @@
 // Lucene version compatibility level 4.8.1
 using J2N.Threading.Atomic;
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using Lucene.Net.Support.Threading;
 using System;
 using System.Collections.Generic;
@@ -274,7 +275,7 @@ namespace Lucene.Net.Facet.Taxonomy
         {
             string[] fullPath = new string[path.Length + 1];
             fullPath[0] = dim;
-            Array.Copy(path, 0, fullPath, 1, path.Length);
+            Arrays.Copy(path, 0, fullPath, 1, path.Length);
             return GetOrdinal(new FacetLabel(fullPath));
         }
 
diff --git a/src/Lucene.Net.Facet/Taxonomy/WriterCache/CharBlockArray.cs b/src/Lucene.Net.Facet/Taxonomy/WriterCache/CharBlockArray.cs
index 8b7466f55..8fa8b4097 100644
--- a/src/Lucene.Net.Facet/Taxonomy/WriterCache/CharBlockArray.cs
+++ b/src/Lucene.Net.Facet/Taxonomy/WriterCache/CharBlockArray.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using J2N.Text;
+using Lucene.Net.Support;
 using Lucene.Net.Support.IO;
 using System;
 using System.Collections.Generic;
@@ -59,7 +60,7 @@ namespace Lucene.Net.Facet.Taxonomy.WriterCache
             {
                 var clone = new Block(chars.Length);
                 clone.length = length;
-                Array.Copy(chars, clone.chars, chars.Length);
+                Arrays.Copy(chars, clone.chars, chars.Length);
                 return clone;
             }
 
@@ -172,7 +173,7 @@ namespace Lucene.Net.Facet.Taxonomy.WriterCache
                 {
                     toCopy = remainingInBlock;
                 }
-                Array.Copy(chars, offset, this.current.chars, this.current.length, toCopy);
+                Arrays.Copy(chars, offset, this.current.chars, this.current.length, toCopy);
                 offset += toCopy;
                 remain -= toCopy;
                 this.current.length += toCopy;
diff --git a/src/Lucene.Net.Grouping/TopGroups.cs b/src/Lucene.Net.Grouping/TopGroups.cs
index 71437c1d0..60fb8f4c0 100644
--- a/src/Lucene.Net.Grouping/TopGroups.cs
+++ b/src/Lucene.Net.Grouping/TopGroups.cs
@@ -228,7 +228,7 @@ namespace Lucene.Net.Search.Grouping
                 else
                 {
                     mergedScoreDocs = new ScoreDoc[mergedTopDocs.ScoreDocs.Length - docOffset];
-                    Array.Copy(mergedTopDocs.ScoreDocs, docOffset, mergedScoreDocs, 0, mergedTopDocs.ScoreDocs.Length - docOffset);
+                    Arrays.Copy(mergedTopDocs.ScoreDocs, docOffset, mergedScoreDocs, 0, mergedTopDocs.ScoreDocs.Length - docOffset);
                 }
 
                 float groupScore;
diff --git a/src/Lucene.Net.Highlighter/PostingsHighlight/Passage.cs b/src/Lucene.Net.Highlighter/PostingsHighlight/Passage.cs
index f9014cdb8..67e56a0e2 100644
--- a/src/Lucene.Net.Highlighter/PostingsHighlight/Passage.cs
+++ b/src/Lucene.Net.Highlighter/PostingsHighlight/Passage.cs
@@ -1,5 +1,6 @@
 #if FEATURE_BREAKITERATOR
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System.Collections.Generic;
 using System.Diagnostics;
@@ -50,9 +51,9 @@ namespace Lucene.Net.Search.PostingsHighlight
                 int[] newMatchStarts = new int[newLength];
                 int[] newMatchEnds = new int[newLength];
                 BytesRef[] newMatchTerms = new BytesRef[newLength];
-                System.Array.Copy(matchStarts, 0, newMatchStarts, 0, numMatches);
-                System.Array.Copy(matchEnds, 0, newMatchEnds, 0, numMatches);
-                System.Array.Copy(matchTerms, 0, newMatchTerms, 0, numMatches);
+                Arrays.Copy(matchStarts, 0, newMatchStarts, 0, numMatches);
+                Arrays.Copy(matchEnds, 0, newMatchEnds, 0, numMatches);
+                Arrays.Copy(matchTerms, 0, newMatchTerms, 0, numMatches);
                 matchStarts = newMatchStarts;
                 matchEnds = newMatchEnds;
                 matchTerms = newMatchTerms;
diff --git a/src/Lucene.Net.Highlighter/PostingsHighlight/PostingsHighlighter.cs b/src/Lucene.Net.Highlighter/PostingsHighlight/PostingsHighlighter.cs
index 908168d4b..cb93affea 100644
--- a/src/Lucene.Net.Highlighter/PostingsHighlight/PostingsHighlighter.cs
+++ b/src/Lucene.Net.Highlighter/PostingsHighlight/PostingsHighlighter.cs
@@ -415,11 +415,11 @@ namespace Lucene.Net.Search.PostingsHighlight
 
             // Make our own copies because we sort in-place:
             int[] docids = new int[docidsIn.Length];
-            System.Array.Copy(docidsIn, 0, docids, 0, docidsIn.Length);
+            Arrays.Copy(docidsIn, 0, docids, 0, docidsIn.Length);
             string[] fields = new string[fieldsIn.Length];
-            System.Array.Copy(fieldsIn, 0, fields, 0, fieldsIn.Length);
+            Arrays.Copy(fieldsIn, 0, fields, 0, fieldsIn.Length);
             int[] maxPassages = new int[maxPassagesIn.Length];
-            System.Array.Copy(maxPassagesIn, 0, maxPassages, 0, maxPassagesIn.Length);
+            Arrays.Copy(maxPassagesIn, 0, maxPassages, 0, maxPassagesIn.Length);
 
             // sort for sequential io
             ArrayUtil.TimSort(docids);
@@ -535,7 +535,7 @@ namespace Lucene.Net.Search.PostingsHighlight
             if (automata.Length > 0)
             {
                 BytesRef[] newTerms = new BytesRef[terms.Length + 1];
-                System.Array.Copy(terms, 0, newTerms, 0, terms.Length);
+                Arrays.Copy(terms, 0, newTerms, 0, terms.Length);
                 terms = newTerms;
             }
 
diff --git a/src/Lucene.Net.Join/Support/ToParentBlockJoinCollector.cs b/src/Lucene.Net.Join/Support/ToParentBlockJoinCollector.cs
index 425f6b7f7..c1ad71381 100644
--- a/src/Lucene.Net.Join/Support/ToParentBlockJoinCollector.cs
+++ b/src/Lucene.Net.Join/Support/ToParentBlockJoinCollector.cs
@@ -329,7 +329,7 @@ namespace Lucene.Net.Join
                 joinQueryID[query] = joinScorers.Length;
                 //System.out.println("found JQ: " + query + " slot=" + joinScorers.length);
                 ToParentBlockJoinQuery.BlockJoinScorer[] newArray = new ToParentBlockJoinQuery.BlockJoinScorer[1 + joinScorers.Length];
-                Array.Copy(joinScorers, 0, newArray, 0, joinScorers.Length);
+                Arrays.Copy(joinScorers, 0, newArray, 0, joinScorers.Length);
                 joinScorers = newArray;
                 joinScorers[joinScorers.Length - 1] = scorer;
             }
diff --git a/src/Lucene.Net.Join/ToParentBlockJoinCollector.cs b/src/Lucene.Net.Join/ToParentBlockJoinCollector.cs
index b29550254..5b3dfbdea 100644
--- a/src/Lucene.Net.Join/ToParentBlockJoinCollector.cs
+++ b/src/Lucene.Net.Join/ToParentBlockJoinCollector.cs
@@ -327,7 +327,7 @@ namespace Lucene.Net.Search.Join
                 joinQueryID[query] = joinScorers.Length;
                 //System.out.println("found JQ: " + query + " slot=" + joinScorers.length);
                 ToParentBlockJoinQuery.BlockJoinScorer[] newArray = new ToParentBlockJoinQuery.BlockJoinScorer[1 + joinScorers.Length];
-                Array.Copy(joinScorers, 0, newArray, 0, joinScorers.Length);
+                Arrays.Copy(joinScorers, 0, newArray, 0, joinScorers.Length);
                 joinScorers = newArray;
                 joinScorers[joinScorers.Length - 1] = scorer;
             }
diff --git a/src/Lucene.Net.Misc/Index/Sorter/Sorter.cs b/src/Lucene.Net.Misc/Index/Sorter/Sorter.cs
index a8259c181..e14b6d73d 100644
--- a/src/Lucene.Net.Misc/Index/Sorter/Sorter.cs
+++ b/src/Lucene.Net.Misc/Index/Sorter/Sorter.cs
@@ -1,5 +1,6 @@
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Search;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using Lucene.Net.Util.Packed;
 using System;
@@ -141,7 +142,7 @@ namespace Lucene.Net.Index.Sorter
 
             protected override void Save(int i, int len)
             {
-                Array.Copy(docs, i, tmp, 0, len);
+                Arrays.Copy(docs, i, tmp, 0, len);
             }
 
             protected override void Restore(int i, int j)
diff --git a/src/Lucene.Net.Misc/Index/Sorter/SortingAtomicReader.cs b/src/Lucene.Net.Misc/Index/Sorter/SortingAtomicReader.cs
index b6eedc144..ff91dd723 100644
--- a/src/Lucene.Net.Misc/Index/Sorter/SortingAtomicReader.cs
+++ b/src/Lucene.Net.Misc/Index/Sorter/SortingAtomicReader.cs
@@ -369,10 +369,10 @@ namespace Lucene.Net.Index.Sorter
 
                 protected override void Save(int i, int len)
                 {
-                    Array.Copy(docs, i, tmpDocs, 0, len);
+                    Arrays.Copy(docs, i, tmpDocs, 0, len);
                     if (freqs != null)
                     {
-                        Array.Copy(freqs, i, tmpFreqs, 0, len);
+                        Arrays.Copy(freqs, i, tmpFreqs, 0, len);
                     }
                 }
 
@@ -548,8 +548,8 @@ namespace Lucene.Net.Index.Sorter
 
                 protected override void Save(int i, int len)
                 {
-                    Array.Copy(docs, i, tmpDocs, 0, len);
-                    Array.Copy(offsets, i, tmpOffsets, 0, len);
+                    Arrays.Copy(docs, i, tmpDocs, 0, len);
+                    Arrays.Copy(offsets, i, tmpOffsets, 0, len);
                 }
 
                 protected override void Restore(int i, int j)
diff --git a/src/Lucene.Net.Queries/TermsFilter.cs b/src/Lucene.Net.Queries/TermsFilter.cs
index 23e138c60..c3206cc8d 100644
--- a/src/Lucene.Net.Queries/TermsFilter.cs
+++ b/src/Lucene.Net.Queries/TermsFilter.cs
@@ -209,7 +209,7 @@ namespace Lucene.Net.Queries
                 {
                     serializedTerms = ArrayUtil.Grow(serializedTerms, lastEndOffset + currentTerm.Length);
                 }
-                Array.Copy(currentTerm.Bytes, currentTerm.Offset, serializedTerms, lastEndOffset, currentTerm.Length);
+                Arrays.Copy(currentTerm.Bytes, currentTerm.Offset, serializedTerms, lastEndOffset, currentTerm.Length);
                 offsets[index] = lastEndOffset;
                 lastEndOffset += currentTerm.Length;
                 index++;
diff --git a/src/Lucene.Net.QueryParser/Classic/FastCharStream.cs b/src/Lucene.Net.QueryParser/Classic/FastCharStream.cs
index 828a0af86..7c02de3fd 100644
--- a/src/Lucene.Net.QueryParser/Classic/FastCharStream.cs
+++ b/src/Lucene.Net.QueryParser/Classic/FastCharStream.cs
@@ -1,4 +1,5 @@
-using System;
+using Lucene.Net.Support;
+using System;
 using System.IO;
 using Console = Lucene.Net.Util.SystemConsole;
 
@@ -72,14 +73,14 @@ namespace Lucene.Net.QueryParsers.Classic
                 {
                     // grow buffer
                     char[] newBuffer = new char[buffer.Length * 2];
-                    Array.Copy(buffer, 0, newBuffer, 0, bufferLength);
+                    Arrays.Copy(buffer, 0, newBuffer, 0, bufferLength);
                     buffer = newBuffer;
                 }
             }
             else
             {
                 // shift token to front
-                Array.Copy(buffer, tokenStart, buffer, 0, newPosition);
+                Arrays.Copy(buffer, tokenStart, buffer, 0, newPosition);
             }
             
             bufferLength = newPosition; // update state
@@ -110,7 +111,7 @@ namespace Lucene.Net.QueryParsers.Classic
         public char[] GetSuffix(int len)
         {
             char[] value = new char[len];
-            Array.Copy(buffer, bufferPosition - len, value, 0, len);
+            Arrays.Copy(buffer, bufferPosition - len, value, 0, len);
             return value;
         }
         
diff --git a/src/Lucene.Net.QueryParser/Flexible/Core/Util/UnescapedCharSequence.cs b/src/Lucene.Net.QueryParser/Flexible/Core/Util/UnescapedCharSequence.cs
index a62c7e74e..db96cede5 100644
--- a/src/Lucene.Net.QueryParser/Flexible/Core/Util/UnescapedCharSequence.cs
+++ b/src/Lucene.Net.QueryParser/Flexible/Core/Util/UnescapedCharSequence.cs
@@ -1,4 +1,5 @@
 using J2N.Text;
+using Lucene.Net.Support;
 using System.Globalization;
 using System.Text;
 
@@ -38,8 +39,8 @@ namespace Lucene.Net.QueryParsers.Flexible.Core.Util
         {
             this.chars = new char[length];
             this.wasEscaped = new bool[length];
-            System.Array.Copy(chars, offset, this.chars, 0, length);
-            System.Array.Copy(wasEscaped, offset, this.wasEscaped, 0, length);
+            Arrays.Copy(chars, offset, this.chars, 0, length);
+            Arrays.Copy(wasEscaped, offset, this.wasEscaped, 0, length);
         }
 
         /// <summary>
diff --git a/src/Lucene.Net.QueryParser/Flexible/Standard/Parser/FastCharStream.cs b/src/Lucene.Net.QueryParser/Flexible/Standard/Parser/FastCharStream.cs
index 1ce44fd1e..074c4c61e 100644
--- a/src/Lucene.Net.QueryParser/Flexible/Standard/Parser/FastCharStream.cs
+++ b/src/Lucene.Net.QueryParser/Flexible/Standard/Parser/FastCharStream.cs
@@ -1,4 +1,5 @@
-using System;
+using Lucene.Net.Support;
+using System;
 using System.IO;
 
 namespace Lucene.Net.QueryParsers.Flexible.Standard.Parser
@@ -68,13 +69,13 @@ namespace Lucene.Net.QueryParsers.Flexible.Standard.Parser
                 else if (bufferLength == buffer.Length)
                 { // grow buffer
                     char[] newBuffer = new char[buffer.Length * 2];
-                    System.Array.Copy(buffer, 0, newBuffer, 0, bufferLength);
+                    Arrays.Copy(buffer, 0, newBuffer, 0, bufferLength);
                     buffer = newBuffer;
                 }
             }
             else
             {            // shift token to front
-                System.Array.Copy(buffer, tokenStart, buffer, 0, newPosition);
+                Arrays.Copy(buffer, tokenStart, buffer, 0, newPosition);
             }
 
             bufferLength = newPosition;        // update state
@@ -109,7 +110,7 @@ namespace Lucene.Net.QueryParsers.Flexible.Standard.Parser
         public char[] GetSuffix(int len)
         {
             char[] value = new char[len];
-            System.Array.Copy(buffer, bufferPosition - len, value, 0, len);
+            Arrays.Copy(buffer, bufferPosition - len, value, 0, len);
             return value;
         }
 
diff --git a/src/Lucene.Net.QueryParser/Surround/Parser/FastCharStream.cs b/src/Lucene.Net.QueryParser/Surround/Parser/FastCharStream.cs
index 3b94675e9..fbf9b8424 100644
--- a/src/Lucene.Net.QueryParser/Surround/Parser/FastCharStream.cs
+++ b/src/Lucene.Net.QueryParser/Surround/Parser/FastCharStream.cs
@@ -1,4 +1,5 @@
-using System;
+using Lucene.Net.Support;
+using System;
 using System.IO;
 using Console = Lucene.Net.Util.SystemConsole;
 
@@ -72,14 +73,14 @@ namespace Lucene.Net.QueryParsers.Surround.Parser
                 {
                     // grow buffer
                     char[] newBuffer = new char[buffer.Length * 2];
-                    Array.Copy(buffer, 0, newBuffer, 0, bufferLength);
+                    Arrays.Copy(buffer, 0, newBuffer, 0, bufferLength);
                     buffer = newBuffer;
                 }
             }
             else
             {
                 // shift token to front
-                Array.Copy(buffer, tokenStart, buffer, 0, newPosition);
+                Arrays.Copy(buffer, tokenStart, buffer, 0, newPosition);
             }
 
             bufferLength = newPosition; // update state
@@ -110,7 +111,7 @@ namespace Lucene.Net.QueryParsers.Surround.Parser
         public char[] GetSuffix(int len)
         {
             char[] value = new char[len];
-            Array.Copy(buffer, bufferPosition - len, value, 0, len);
+            Arrays.Copy(buffer, bufferPosition - len, value, 0, len);
             return value;
         }
 
diff --git a/src/Lucene.Net.Sandbox/Queries/SlowFuzzyTermsEnum.cs b/src/Lucene.Net.Sandbox/Queries/SlowFuzzyTermsEnum.cs
index 9ce8bc97a..2a730c656 100644
--- a/src/Lucene.Net.Sandbox/Queries/SlowFuzzyTermsEnum.cs
+++ b/src/Lucene.Net.Sandbox/Queries/SlowFuzzyTermsEnum.cs
@@ -1,5 +1,6 @@
 using Lucene.Net.Index;
 using Lucene.Net.Search;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
 using System.IO;
@@ -92,7 +93,7 @@ namespace Lucene.Net.Sandbox.Queries
                 this.boostAtt = Attributes.AddAttribute<IBoostAttribute>();
 
                 this.text = new int[outerInstance.m_termLength - outerInstance.m_realPrefixLength];
-                System.Array.Copy(outerInstance.m_termText, outerInstance.m_realPrefixLength, text, 0, text.Length);
+                Arrays.Copy(outerInstance.m_termText, outerInstance.m_realPrefixLength, text, 0, text.Length);
                 string prefix = UnicodeUtil.NewString(outerInstance.m_termText, 0, outerInstance.m_realPrefixLength);
                 prefixBytesRef = new BytesRef(prefix);
                 this.d = new int[this.text.Length + 1];
diff --git a/src/Lucene.Net.Suggest/Spell/DirectSpellChecker.cs b/src/Lucene.Net.Suggest/Spell/DirectSpellChecker.cs
index 99eddad95..67a184f36 100644
--- a/src/Lucene.Net.Suggest/Spell/DirectSpellChecker.cs
+++ b/src/Lucene.Net.Suggest/Spell/DirectSpellChecker.cs
@@ -400,7 +400,7 @@ namespace Lucene.Net.Search.Spell
             if (numSug < suggestions.Length)
             {
                 SuggestWord[] trimmed = new SuggestWord[numSug];
-                Array.Copy(suggestions, 0, trimmed, 0, numSug);
+                Arrays.Copy(suggestions, 0, trimmed, 0, numSug);
                 suggestions = trimmed;
             }
             return suggestions;
diff --git a/src/Lucene.Net.Suggest/Spell/WordBreakSpellChecker.cs b/src/Lucene.Net.Suggest/Spell/WordBreakSpellChecker.cs
index 2ac813557..fed3d1cd3 100644
--- a/src/Lucene.Net.Suggest/Spell/WordBreakSpellChecker.cs
+++ b/src/Lucene.Net.Suggest/Spell/WordBreakSpellChecker.cs
@@ -322,7 +322,7 @@ namespace Lucene.Net.Search.Spell
         private static SuggestWord[] NewPrefix(SuggestWord[] oldPrefix, SuggestWord append)
         {
             SuggestWord[] newPrefix = new SuggestWord[oldPrefix.Length + 1];
-            Array.Copy(oldPrefix, 0, newPrefix, 0, oldPrefix.Length);
+            Arrays.Copy(oldPrefix, 0, newPrefix, 0, oldPrefix.Length);
             newPrefix[newPrefix.Length - 1] = append;
             return newPrefix;
         }
diff --git a/src/Lucene.Net.Suggest/Suggest/Analyzing/AnalyzingSuggester.cs b/src/Lucene.Net.Suggest/Suggest/Analyzing/AnalyzingSuggester.cs
index 2c8e11a61..e365533b4 100644
--- a/src/Lucene.Net.Suggest/Suggest/Analyzing/AnalyzingSuggester.cs
+++ b/src/Lucene.Net.Suggest/Suggest/Analyzing/AnalyzingSuggester.cs
@@ -604,9 +604,9 @@ namespace Lucene.Net.Search.Suggest.Analyzing
                         int payloadOffset = input.Position + surface.Length;
                         int payloadLength = scratch.Length - payloadOffset;
                         BytesRef br = new BytesRef(surface.Length + 1 + payloadLength);
-                        Array.Copy(surface.Bytes, surface.Offset, br.Bytes, 0, surface.Length);
+                        Arrays.Copy(surface.Bytes, surface.Offset, br.Bytes, 0, surface.Length);
                         br.Bytes[surface.Length] = PAYLOAD_SEP;
-                        Array.Copy(scratch.Bytes, payloadOffset, br.Bytes, surface.Length + 1, payloadLength);
+                        Arrays.Copy(scratch.Bytes, payloadOffset, br.Bytes, surface.Length + 1, payloadLength);
                         br.Length = br.Bytes.Length;
                         builder.Add(scratchInts, outputs.NewPair(cost, br));
                     }
@@ -676,7 +676,7 @@ namespace Lucene.Net.Search.Suggest.Analyzing
                 int payloadLen = output2.Length - sepIndex - 1;
                 UnicodeUtil.UTF8toUTF16(output2.Bytes, output2.Offset, sepIndex, spare);
                 BytesRef payload = new BytesRef(payloadLen);
-                Array.Copy(output2.Bytes, sepIndex + 1, payload.Bytes, 0, payloadLen);
+                Arrays.Copy(output2.Bytes, sepIndex + 1, payload.Bytes, 0, payloadLen);
                 payload.Length = payloadLen;
                 result = new LookupResult(spare.ToString(), DecodeWeight(output1.GetValueOrDefault()), payload);
             }
diff --git a/src/Lucene.Net.Suggest/Suggest/Analyzing/FuzzySuggester.cs b/src/Lucene.Net.Suggest/Suggest/Analyzing/FuzzySuggester.cs
index 657b1432a..7b0177e74 100644
--- a/src/Lucene.Net.Suggest/Suggest/Analyzing/FuzzySuggester.cs
+++ b/src/Lucene.Net.Suggest/Suggest/Analyzing/FuzzySuggester.cs
@@ -1,5 +1,6 @@
 using J2N;
 using Lucene.Net.Analysis;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using Lucene.Net.Util.Automaton;
 using Lucene.Net.Util.Fst;
@@ -235,7 +236,7 @@ namespace Lucene.Net.Search.Suggest.Analyzing
                 {
                     Automaton prefix = BasicAutomata.MakeString(path.Int32s, path.Offset, nonFuzzyPrefix);
                     int[] ints = new int[path.Length - nonFuzzyPrefix];
-                    Array.Copy(path.Int32s, path.Offset + nonFuzzyPrefix, ints, 0, ints.Length);
+                    Arrays.Copy(path.Int32s, path.Offset + nonFuzzyPrefix, ints, 0, ints.Length);
                     // TODO: maybe add alphaMin to LevenshteinAutomata,
                     // and pass 1 instead of 0?  We probably don't want
                     // to allow the trailing dedup bytes to be
diff --git a/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs b/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs
index e265c21b6..badefe6a6 100644
--- a/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs
@@ -3,6 +3,7 @@ using J2N.Threading.Atomic;
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
+using Lucene.Net.Support;
 using Lucene.Net.Support.Threading;
 using Lucene.Net.Util;
 using System;
@@ -336,7 +337,7 @@ namespace Lucene.Net.Codecs.RAMOnly
                         current.payloads = new byte[current.positions.Length][];
                     }
                     var bytes = current.payloads[posUpto] = new byte[payload.Length];
-                    Array.Copy(payload.Bytes, payload.Offset, bytes, 0, payload.Length);
+                    Arrays.Copy(payload.Bytes, payload.Offset, bytes, 0, payload.Length);
                 }
                 posUpto++;
             }
diff --git a/src/Lucene.Net.TestFramework/Index/BasePostingsFormatTestCase.cs b/src/Lucene.Net.TestFramework/Index/BasePostingsFormatTestCase.cs
index 04e939b83..80c51f61a 100644
--- a/src/Lucene.Net.TestFramework/Index/BasePostingsFormatTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Index/BasePostingsFormatTestCase.cs
@@ -4,6 +4,7 @@ using Lucene.Net.Codecs;
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Documents;
 using Lucene.Net.Store;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using RandomizedTesting.Generators;
 using System;
@@ -1256,7 +1257,7 @@ namespace Lucene.Net.Index
             // LUCENENET: A bit of extra work required since we don't have an easy way to filter out
             // the "NONE" option we added to avoid having to use null
             IndexOptions[] allOptions = new IndexOptions[ALL_INDEX_OPTIONS.Length - 1];
-            Array.Copy(ALL_INDEX_OPTIONS, 1, allOptions, 0, allOptions.Length); // LUCENENET: Skip our NONE option
+            Arrays.Copy(ALL_INDEX_OPTIONS, 1, allOptions, 0, allOptions.Length); // LUCENENET: Skip our NONE option
             int maxIndexOption = Array.IndexOf(allOptions, options);
 
             ISet<Option> allOptionsHashSet = new JCG.HashSet<Option>((Option[])Enum.GetValues(typeof(Option)));
diff --git a/src/Lucene.Net.TestFramework/Index/MockIndexInput.cs b/src/Lucene.Net.TestFramework/Index/MockIndexInput.cs
index 06ec64515..b92ef08a9 100644
--- a/src/Lucene.Net.TestFramework/Index/MockIndexInput.cs
+++ b/src/Lucene.Net.TestFramework/Index/MockIndexInput.cs
@@ -1,3 +1,5 @@
+using Lucene.Net.Support;
+
 namespace Lucene.Net.Index
 {
     /*
@@ -47,7 +49,7 @@ namespace Lucene.Net.Index
                 int bufferOffset = start % buffer.Length;
                 int bytesInBuffer = buffer.Length - bufferOffset;
                 int bytesToCopy = bytesInBuffer >= remainder ? remainder : bytesInBuffer;
-                System.Buffer.BlockCopy(buffer, bufferOffset, dest, destOffset, bytesToCopy);
+                Arrays.Copy(buffer, bufferOffset, dest, destOffset, bytesToCopy);
                 destOffset += bytesToCopy;
                 start += bytesToCopy;
                 remainder -= bytesToCopy;
diff --git a/src/Lucene.Net.TestFramework/Search/ShardSearchingTestBase.cs b/src/Lucene.Net.TestFramework/Search/ShardSearchingTestBase.cs
index f005e86ae..4d81ee359 100644
--- a/src/Lucene.Net.TestFramework/Search/ShardSearchingTestBase.cs
+++ b/src/Lucene.Net.TestFramework/Search/ShardSearchingTestBase.cs
@@ -593,7 +593,7 @@ namespace Lucene.Net.Search
             public void InitSearcher(long[] nodeVersions)
             {
                 if (Debugging.AssertsEnabled) Debugging.Assert(currentShardSearcher is null);
-                Array.Copy(nodeVersions, 0, currentNodeVersions, 0, currentNodeVersions.Length);
+                Arrays.Copy(nodeVersions, 0, currentNodeVersions, 0, currentNodeVersions.Length);
                 currentShardSearcher = new ShardIndexSearcher(this, GetCurrentNodeVersions(), Mgr.Acquire().IndexReader, MyNodeID);
             }
 
diff --git a/src/Lucene.Net.TestFramework/Store/BaseDirectoryTestCase.cs b/src/Lucene.Net.TestFramework/Store/BaseDirectoryTestCase.cs
index dd7341707..1609120c7 100644
--- a/src/Lucene.Net.TestFramework/Store/BaseDirectoryTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Store/BaseDirectoryTestCase.cs
@@ -861,7 +861,7 @@ namespace Lucene.Net.Store
             {
                 using IndexInput copiedData = d.OpenInput("copy" + i, IOContext.DEFAULT);
                 byte[] dataCopy = new byte[data.Length];
-                System.Array.Copy(data, 0, dataCopy, 0, 100);
+                Arrays.Copy(data, 0, dataCopy, 0, 100);
                 copiedData.ReadBytes(dataCopy, 100, data.Length - 100);
                 Assert.AreEqual(data, dataCopy);
             }
@@ -1207,7 +1207,7 @@ namespace Lucene.Net.Store
         //                    assertEquals(0, slice2.Position); // LUCENENET specific: Renamed from getFilePointer() to match FileStream
         //                    assertEquals(num - i - j, slice2.Length);
         //                    byte[] data = new byte[num];
-        //                    System.Array.Copy(bytes, 0, data, 0, i + j);
+        //                    Arrays.Copy(bytes, 0, data, 0, i + j);
         //                    if (Random.nextBoolean())
         //                    {
         //                        // read the bytes for this slice-of-slice
diff --git a/src/Lucene.Net.TestFramework/Util/Fst/FSTTester.cs b/src/Lucene.Net.TestFramework/Util/Fst/FSTTester.cs
index 82ba89e40..9b4decc83 100644
--- a/src/Lucene.Net.TestFramework/Util/Fst/FSTTester.cs
+++ b/src/Lucene.Net.TestFramework/Util/Fst/FSTTester.cs
@@ -3,6 +3,7 @@ using J2N.Collections;
 using J2N.Collections.Generic.Extensions;
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Store;
+using Lucene.Net.Support;
 using Lucene.Net.Util.Packed;
 using RandomizedTesting.Generators;
 using System;
@@ -909,7 +910,7 @@ namespace Lucene.Net.Util.Fst
                         {
                             // consult our parent
                             scratch.Length = prefix.Length - 1;
-                            Array.Copy(prefix.Int32s, prefix.Offset, scratch.Int32s, 0, scratch.Length);
+                            Arrays.Copy(prefix.Int32s, prefix.Offset, scratch.Int32s, 0, scratch.Length);
                             keep = prefixes.TryGetValue(scratch, out CountMinOutput<T> cmo2) && cmo2 != null && ((prune2 > 1 && cmo2.Count >= prune2) || (prune2 == 1 && (cmo2.Count >= 2 || prefix.Length <= 1)));
                             //System.out.println("    parent count = " + (cmo2 is null ? -1 : cmo2.count));
                         }
diff --git a/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs b/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs
index 7992e19dd..dc28893a2 100644
--- a/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs
@@ -2511,7 +2511,7 @@ namespace Lucene.Net.Util
                     {
                         // term, but ensure a non-zero offset
                         var newbytes = new byte[term.Length + 5];
-                        Array.Copy(term.Bytes, term.Offset, newbytes, 5, term.Length);
+                        Arrays.Copy(term.Bytes, term.Offset, newbytes, 5, term.Length);
                         tests.Add(new BytesRef(newbytes, 5, term.Length));
                     }
                     else if (code == 3)
diff --git a/src/Lucene.Net.Tests.Analysis.Common/Analysis/Util/TestBufferedCharFilter.cs b/src/Lucene.Net.Tests.Analysis.Common/Analysis/Util/TestBufferedCharFilter.cs
index f99c02b2e..ce6e3941e 100644
--- a/src/Lucene.Net.Tests.Analysis.Common/Analysis/Util/TestBufferedCharFilter.cs
+++ b/src/Lucene.Net.Tests.Analysis.Common/Analysis/Util/TestBufferedCharFilter.cs
@@ -3,6 +3,7 @@
 // https://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/
 
 using Lucene.Net.Attributes;
+using Lucene.Net.Support;
 using Lucene.Net.Util;
 using NUnit.Framework;
 using System;
@@ -280,7 +281,7 @@ namespace Lucene.Net.Analysis.Util
                 int toRead = len;
                 if (toRead > (SIZE - pos))
                     toRead = SIZE - pos;
-                System.Array.Copy(contents, pos, buf, off, toRead);
+                Arrays.Copy(contents, pos, buf, off, toRead);
                 pos += toRead;
                 return toRead;
             }
diff --git a/src/Lucene.Net.Tests.Facet/TestDrillSideways.cs b/src/Lucene.Net.Tests.Facet/TestDrillSideways.cs
index 341fd5371..4ff35b84b 100644
--- a/src/Lucene.Net.Tests.Facet/TestDrillSideways.cs
+++ b/src/Lucene.Net.Tests.Facet/TestDrillSideways.cs
@@ -985,7 +985,7 @@ namespace Lucene.Net.Facet
             }
 
             int[] topNIDs = new int[numSet];
-            Array.Copy(ids, 0, topNIDs, 0, topNIDs.Length);
+            Arrays.Copy(ids, 0, topNIDs, 0, topNIDs.Length);
             return topNIDs;
         }
 
diff --git a/src/Lucene.Net.Tests.Grouping/TestGrouping.cs b/src/Lucene.Net.Tests.Grouping/TestGrouping.cs
index 606a06596..3cfb50a89 100644
--- a/src/Lucene.Net.Tests.Grouping/TestGrouping.cs
+++ b/src/Lucene.Net.Tests.Grouping/TestGrouping.cs
@@ -907,7 +907,7 @@ namespace Lucene.Net.Search.Grouping
                 }
 
                 GroupDoc[] groupDocsByID = new GroupDoc[groupDocs.Length];
-                System.Array.Copy(groupDocs, 0, groupDocsByID, 0, groupDocs.Length);
+                Arrays.Copy(groupDocs, 0, groupDocsByID, 0, groupDocs.Length);
 
                 DirectoryReader r = w.GetReader();
                 w.Dispose();
diff --git a/src/Lucene.Net.Tests/Codecs/Compressing/AbstractTestLZ4CompressionMode.cs b/src/Lucene.Net.Tests/Codecs/Compressing/AbstractTestLZ4CompressionMode.cs
index ddcb199ce..058e87112 100644
--- a/src/Lucene.Net.Tests/Codecs/Compressing/AbstractTestLZ4CompressionMode.cs
+++ b/src/Lucene.Net.Tests/Codecs/Compressing/AbstractTestLZ4CompressionMode.cs
@@ -1,5 +1,6 @@
 using J2N.Numerics;
 using J2N.Text;
+using Lucene.Net.Support;
 using NUnit.Framework;
 using System;
 using System.Text;
@@ -118,7 +119,7 @@ namespace Lucene.Net.Codecs.Compressing
             int matchRef = Random.Next(30);
             int matchOff = RandomInts.RandomInt32Between(Random, decompressed.Length - 40, decompressed.Length - 20);
             int matchLength = RandomInts.RandomInt32Between(Random, 4, 10);
-            Array.Copy(decompressed, matchRef, decompressed, matchOff, matchLength);
+            Arrays.Copy(decompressed, matchRef, decompressed, matchOff, matchLength);
             Test(decompressed);
         }
 
diff --git a/src/Lucene.Net.Tests/Codecs/Lucene41/TestBlockPostingsFormat3.cs b/src/Lucene.Net.Tests/Codecs/Lucene41/TestBlockPostingsFormat3.cs
index b8d3e18ef..faf1f05ea 100644
--- a/src/Lucene.Net.Tests/Codecs/Lucene41/TestBlockPostingsFormat3.cs
+++ b/src/Lucene.Net.Tests/Codecs/Lucene41/TestBlockPostingsFormat3.cs
@@ -4,6 +4,7 @@ using Lucene.Net.Diagnostics;
 using Lucene.Net.Documents;
 using Lucene.Net.Index;
 using Lucene.Net.Index.Extensions;
+using Lucene.Net.Support;
 using Lucene.Net.Util.Automaton;
 using NUnit.Framework;
 using RandomizedTesting.Generators;
@@ -254,7 +255,7 @@ namespace Lucene.Net.Codecs.Lucene41
                     {
                         // term, but ensure a non-zero offset
                         var newbytes = new byte[term.Length + 5];
-                        Array.Copy(term.Bytes, term.Offset, newbytes, 5, term.Length);
+                        Arrays.Copy(term.Bytes, term.Offset, newbytes, 5, term.Length);
                         tests.Add(new BytesRef(newbytes, 5, term.Length));
                     }
                 }
diff --git a/src/Lucene.Net.Tests/Index/TestPayloads.cs b/src/Lucene.Net.Tests/Index/TestPayloads.cs
index c6a5c4e36..edec401fb 100644
--- a/src/Lucene.Net.Tests/Index/TestPayloads.cs
+++ b/src/Lucene.Net.Tests/Index/TestPayloads.cs
@@ -5,6 +5,7 @@ using Lucene.Net.Analysis.TokenAttributes;
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Documents;
 using Lucene.Net.Index.Extensions;
+using Lucene.Net.Support;
 using Lucene.Net.Support.Threading;
 using Lucene.Net.Util;
 using NUnit.Framework;
@@ -221,7 +222,7 @@ namespace Lucene.Net.Index
                         BytesRef br = tps[j].GetPayload();
                         if (br != null)
                         {
-                            Array.Copy(br.Bytes, br.Offset, verifyPayloadData, offset, br.Length);
+                            Arrays.Copy(br.Bytes, br.Offset, verifyPayloadData, offset, br.Length);
                             offset += br.Length;
                         }
                     }
@@ -297,7 +298,7 @@ namespace Lucene.Net.Index
             BytesRef bref = tp.GetPayload();
             verifyPayloadData = new byte[bref.Length];
             var portion = new byte[1500];
-            Array.Copy(payloadData, 100, portion, 0, 1500);
+            Arrays.Copy(payloadData, 100, portion, 0, 1500);
 
             AssertByteArrayEquals(portion, bref.Bytes, bref.Offset, bref.Length);
             reader.Dispose();
@@ -313,7 +314,7 @@ namespace Lucene.Net.Index
             string s = TestUtil.RandomFixedByteLengthUnicodeString(Random, data.Length);
             var b = s.GetBytes(utf8);
             if (Debugging.AssertsEnabled) Debugging.Assert(b.Length == data.Length);
-            System.Buffer.BlockCopy(b, 0, data, 0, b.Length);
+            Arrays.Copy(b, 0, data, 0, b.Length);
         }
 
         private byte[] GenerateRandomData(int n)
diff --git a/src/Lucene.Net.Tests/Index/TestStressIndexing2.cs b/src/Lucene.Net.Tests/Index/TestStressIndexing2.cs
index 08dd59119..89c7d718b 100644
--- a/src/Lucene.Net.Tests/Index/TestStressIndexing2.cs
+++ b/src/Lucene.Net.Tests/Index/TestStressIndexing2.cs
@@ -843,7 +843,7 @@ namespace Lucene.Net.Index
                 if (buffer.Length < 1 + end)
                 {
                     char[] newBuffer = new char[(int)((1 + end) * 1.25)];
-                    Array.Copy(buffer, 0, newBuffer, 0, buffer.Length);
+                    Arrays.Copy(buffer, 0, newBuffer, 0, buffer.Length);
                     buffer = newBuffer;
                 }
 
diff --git a/src/Lucene.Net.Tests/Search/TestTopDocsMerge.cs b/src/Lucene.Net.Tests/Search/TestTopDocsMerge.cs
index 19f6526c7..e36c13a62 100644
--- a/src/Lucene.Net.Tests/Search/TestTopDocsMerge.cs
+++ b/src/Lucene.Net.Tests/Search/TestTopDocsMerge.cs
@@ -1,4 +1,5 @@
 using Lucene.Net.Documents;
+using Lucene.Net.Support;
 using NUnit.Framework;
 using RandomizedTesting.Generators;
 using System;
@@ -258,7 +259,7 @@ namespace Lucene.Net.Search
                             // Can't use TopDocs#topDocs(start, howMany), since it has different behaviour when start >= hitCount
                             // than TopDocs#merge currently has
                             ScoreDoc[] newScoreDocs = new ScoreDoc[Math.Min(size, tempTopHits.ScoreDocs.Length - from)];
-                            Array.Copy(tempTopHits.ScoreDocs, from, newScoreDocs, 0, newScoreDocs.Length);
+                            Arrays.Copy(tempTopHits.ScoreDocs, from, newScoreDocs, 0, newScoreDocs.Length);
                             tempTopHits.ScoreDocs = newScoreDocs;
                             topHits = tempTopHits;
                         }
@@ -286,7 +287,7 @@ namespace Lucene.Net.Search
                             // Can't use TopDocs#topDocs(start, howMany), since it has different behaviour when start >= hitCount
                             // than TopDocs#merge currently has
                             ScoreDoc[] newScoreDocs = new ScoreDoc[Math.Min(size, tempTopHits.ScoreDocs.Length - from)];
-                            Array.Copy(tempTopHits.ScoreDocs, from, newScoreDocs, 0, newScoreDocs.Length);
+                            Arrays.Copy(tempTopHits.ScoreDocs, from, newScoreDocs, 0, newScoreDocs.Length);
                             tempTopHits.ScoreDocs = newScoreDocs;
                             topHits = tempTopHits;
                         }
diff --git a/src/Lucene.Net.Tests/Store/TestCopyBytes.cs b/src/Lucene.Net.Tests/Store/TestCopyBytes.cs
index 459bec945..465209b20 100644
--- a/src/Lucene.Net.Tests/Store/TestCopyBytes.cs
+++ b/src/Lucene.Net.Tests/Store/TestCopyBytes.cs
@@ -1,4 +1,5 @@
 using J2N.Threading;
+using Lucene.Net.Support;
 using NUnit.Framework;
 using RandomizedTesting.Generators;
 using System;
@@ -165,7 +166,7 @@ namespace Lucene.Net.Store
             {
                 IndexInput copiedData = d.OpenInput("copy" + i, IOContext.DEFAULT);
                 byte[] dataCopy = new byte[datalen];
-                System.Buffer.BlockCopy(data, 0, dataCopy, 0, 100); // copy the header for easy testing
+                Arrays.Copy(data, 0, dataCopy, 0, 100); // copy the header for easy testing
                 copiedData.ReadBytes(dataCopy, 100, datalen - 100);
                 Assert.AreEqual(data, dataCopy);
                 copiedData.Dispose();
diff --git a/src/Lucene.Net.Tests/Support/TestApiConsistency.cs b/src/Lucene.Net.Tests/Support/TestApiConsistency.cs
index 6ac4ff2e3..73cf3141f 100644
--- a/src/Lucene.Net.Tests/Support/TestApiConsistency.cs
+++ b/src/Lucene.Net.Tests/Support/TestApiConsistency.cs
@@ -38,7 +38,7 @@ namespace Lucene.Net
         [TestCase(typeof(Lucene.Net.Analysis.Analyzer))]
         public override void TestPrivateFieldNames(Type typeFromTargetAssembly)
         {
-            base.TestPrivateFieldNames(typeFromTargetAssembly, @"^Lucene\.Net\.Support\.(?:ConcurrentHashSet|PlatformHelper|DateTimeOffsetUtil)|^Lucene\.ExceptionExtensions|^Lucene\.Net\.Util\.Constants\.MaxStackByteLimit");
+            base.TestPrivateFieldNames(typeFromTargetAssembly, @"^Lucene\.Net\.Support\.(?:ConcurrentHashSet|PlatformHelper|DateTimeOffsetUtil|Arrays)|^Lucene\.ExceptionExtensions|^Lucene\.Net\.Util\.Constants\.MaxStackByteLimit");
         }
 
         [Test, LuceneNetSpecific]
diff --git a/src/Lucene.Net.Tests/Util/BaseSortTestCase.cs b/src/Lucene.Net.Tests/Util/BaseSortTestCase.cs
index cfd018ba9..364504b9c 100644
--- a/src/Lucene.Net.Tests/Util/BaseSortTestCase.cs
+++ b/src/Lucene.Net.Tests/Util/BaseSortTestCase.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Linq;
 using Lucene.Net.Support;
 using NUnit.Framework;
@@ -84,7 +84,7 @@ namespace Lucene.Net.Util
         {
             int o = random.Next(1000);
             var toSort = new Entry[o + arr.Length + random.Next(3)];
-            Array.Copy(arr, 0, toSort, o, arr.Length);
+            Arrays.Copy(arr, 0, toSort, o, arr.Length);
             Sorter sorter = NewSorter(toSort);
             sorter.Sort(o, o + arr.Length);
             AssertSorted(arr, Arrays.CopyOfRange(toSort, o, o + arr.Length));
diff --git a/src/Lucene.Net.Tests/Util/Fst/TestBytesStore.cs b/src/Lucene.Net.Tests/Util/Fst/TestBytesStore.cs
index 2a6f6adfd..f652109d9 100644
--- a/src/Lucene.Net.Tests/Util/Fst/TestBytesStore.cs
+++ b/src/Lucene.Net.Tests/Util/Fst/TestBytesStore.cs
@@ -85,7 +85,7 @@ namespace Lucene.Net.Util.Fst
                                 {
                                     Console.WriteLine("    writeBytes len=" + len + " bytes=" + Arrays.ToString(temp));
                                 }
-                                Array.Copy(temp, 0, expected, pos, temp.Length);
+                                Arrays.Copy(temp, 0, expected, pos, temp.Length);
                                 bytes.WriteBytes(temp, 0, temp.Length);
                                 pos += len;
                             }
@@ -158,7 +158,7 @@ namespace Lucene.Net.Util.Fst
                                     {
                                         Console.WriteLine("    abs writeBytes pos=" + randomPos + " len=" + len + " bytes=" + Arrays.ToString(temp));
                                     }
-                                    Array.Copy(temp, 0, expected, randomPos, temp.Length);
+                                    Arrays.Copy(temp, 0, expected, randomPos, temp.Length);
                                     bytes.WriteBytes(randomPos, temp, 0, temp.Length);
                                 }
                             }
@@ -176,7 +176,7 @@ namespace Lucene.Net.Util.Fst
                                     {
                                         Console.WriteLine("    copyBytes src=" + src + " dest=" + dest + " len=" + len);
                                     }
-                                    Array.Copy(expected, src, expected, dest, len);
+                                    Arrays.Copy(expected, src, expected, dest, len);
                                     bytes.CopyBytes(src, dest, len);
                                 }
                             }
diff --git a/src/Lucene.Net/Analysis/TokenAttributes/CharTermAttributeImpl.cs b/src/Lucene.Net/Analysis/TokenAttributes/CharTermAttributeImpl.cs
index 44c5e21d5..206d8137a 100644
--- a/src/Lucene.Net/Analysis/TokenAttributes/CharTermAttributeImpl.cs
+++ b/src/Lucene.Net/Analysis/TokenAttributes/CharTermAttributeImpl.cs
@@ -1,4 +1,5 @@
 using J2N.Text;
+using Lucene.Net.Support;
 using System;
 using System.Diagnostics.CodeAnalysis;
 using System.Text;
@@ -64,7 +65,7 @@ namespace Lucene.Net.Analysis.TokenAttributes
                 throw new ArgumentOutOfRangeException(nameof(length), length, $"{nameof(length)} must not be negative.");
 
             GrowTermBuffer(length);
-            Array.Copy(buffer, offset, termBuffer, 0, length);
+            Arrays.Copy(buffer, offset, termBuffer, 0, length);
             termLength = length;
         }
 
@@ -261,7 +262,7 @@ namespace Lucene.Net.Analysis.TokenAttributes
             if (startIndex > value.Length - charCount)
                 throw new ArgumentOutOfRangeException(nameof(startIndex), $"Index and length must refer to a location within the string. For example {nameof(startIndex)} + {nameof(charCount)} <= {nameof(Length)}.");
 
-            Array.Copy(value, startIndex, InternalResizeBuffer(termLength + charCount), termLength, charCount);
+            Arrays.Copy(value, startIndex, InternalResizeBuffer(termLength + charCount), termLength, charCount);
             Length += charCount;
 
             return this;
@@ -313,7 +314,7 @@ namespace Lucene.Net.Analysis.TokenAttributes
                 return this; // No-op
             }
             int len = value.Length;
-            Array.Copy(value.Buffer, 0, ResizeBuffer(termLength + len), termLength, len);
+            Arrays.Copy(value.Buffer, 0, ResizeBuffer(termLength + len), termLength, len);
             termLength += len;
             return this;
         }
@@ -359,7 +360,7 @@ namespace Lucene.Net.Analysis.TokenAttributes
             if (termBuffer.Length < length)
             {
                 char[] newBuffer = CreateBuffer(length);
-                Array.Copy(termBuffer, 0, newBuffer, 0, termBuffer.Length);
+                Arrays.Copy(termBuffer, 0, newBuffer, 0, termBuffer.Length);
                 this.termBuffer = newBuffer;
             }
 
@@ -401,7 +402,7 @@ namespace Lucene.Net.Analysis.TokenAttributes
             CharTermAttribute t = (CharTermAttribute)base.Clone();
             // Do a deep clone
             t.termBuffer = new char[this.termLength];
-            Array.Copy(this.termBuffer, 0, t.termBuffer, 0, this.termLength);
+            Arrays.Copy(this.termBuffer, 0, t.termBuffer, 0, this.termLength);
             t.bytes = BytesRef.DeepCopyOf(bytes);
             return t;
         }
diff --git a/src/Lucene.Net/Codecs/BlockTreeTermsReader.cs b/src/Lucene.Net/Codecs/BlockTreeTermsReader.cs
index a4d00156a..f3b696110 100644
--- a/src/Lucene.Net/Codecs/BlockTreeTermsReader.cs
+++ b/src/Lucene.Net/Codecs/BlockTreeTermsReader.cs
@@ -811,7 +811,7 @@ namespace Lucene.Net.Codecs
                             {
                                 this.floorData = new byte[ArrayUtil.Oversize(frameIndexData.Length, 1)];
                             }
-                            System.Buffer.BlockCopy(frameIndexData.Bytes, frameIndexData.Offset, floorData, 0, frameIndexData.Length);
+                            Arrays.Copy(frameIndexData.Bytes, frameIndexData.Offset, floorData, 0, frameIndexData.Length);
                             floorDataReader.Reset(floorData, 0, frameIndexData.Length);
                             // Skip first long -- has redundant fp, hasTerms
                             // flag, isFloor flag
@@ -1065,7 +1065,7 @@ namespace Lucene.Net.Codecs
                     if (ord >= stack.Length)
                     {
                         Frame[] next = new Frame[ArrayUtil.Oversize(1 + ord, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                        Array.Copy(stack, 0, next, 0, stack.Length);
+                        Arrays.Copy(stack, 0, next, 0, stack.Length);
                         for (int stackOrd = stack.Length; stackOrd < next.Length; stackOrd++)
                         {
                             next[stackOrd] = new Frame(this, stackOrd);
@@ -1081,7 +1081,7 @@ namespace Lucene.Net.Codecs
                     if (ord >= arcs.Length)
                     {
                         FST.Arc<BytesRef>[] next = new FST.Arc<BytesRef>[ArrayUtil.Oversize(1 + ord, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                        Array.Copy(arcs, 0, next, 0, arcs.Length);
+                        Arrays.Copy(arcs, 0, next, 0, arcs.Length);
                         for (int arcOrd = arcs.Length; arcOrd < next.Length; arcOrd++)
                         {
                             next[arcOrd] = new FST.Arc<BytesRef>();
@@ -1214,7 +1214,7 @@ namespace Lucene.Net.Codecs
                             {
                                 term.Bytes = ArrayUtil.Grow(term.Bytes, term.Length);
                             }
-                            System.Buffer.BlockCopy(currentFrame.suffixBytes, currentFrame.startBytePos, term.Bytes, currentFrame.prefix, currentFrame.suffix);
+                            Arrays.Copy(currentFrame.suffixBytes, currentFrame.startBytePos, term.Bytes, currentFrame.prefix, currentFrame.suffix);
 
                             if (isSubBlock && StringHelper.StartsWith(target, term))
                             {
@@ -1260,7 +1260,7 @@ namespace Lucene.Net.Codecs
                                     currentFrame.suffix = saveSuffix;
                                     currentFrame.suffixesReader.Position = savePos;
                                     currentFrame.termState.TermBlockOrd = saveTermBlockOrd;
-                                    System.Buffer.BlockCopy(currentFrame.suffixBytes, currentFrame.startBytePos, term.Bytes, currentFrame.prefix, currentFrame.suffix);
+                                    Arrays.Copy(currentFrame.suffixBytes, currentFrame.startBytePos, term.Bytes, currentFrame.prefix, currentFrame.suffix);
                                     term.Length = currentFrame.prefix + currentFrame.suffix;
                                     // If the last entry was a block we don't
                                     // need to bother recursing and pushing to
@@ -1464,7 +1464,7 @@ namespace Lucene.Net.Codecs
                     {
                         term.Bytes = ArrayUtil.Grow(term.Bytes, len);
                     }
-                    System.Buffer.BlockCopy(currentFrame.suffixBytes, currentFrame.startBytePos, term.Bytes, currentFrame.prefix, currentFrame.suffix);
+                    Arrays.Copy(currentFrame.suffixBytes, currentFrame.startBytePos, term.Bytes, currentFrame.prefix, currentFrame.suffix);
                     term.Length = len;
                 }
 
@@ -1693,7 +1693,7 @@ namespace Lucene.Net.Codecs
                     if (ord >= stack.Length)
                     {
                         Frame[] next = new Frame[ArrayUtil.Oversize(1 + ord, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                        Array.Copy(stack, 0, next, 0, stack.Length);
+                        Arrays.Copy(stack, 0, next, 0, stack.Length);
                         for (int stackOrd = stack.Length; stackOrd < next.Length; stackOrd++)
                         {
                             next[stackOrd] = new Frame(this, stackOrd);
@@ -1709,7 +1709,7 @@ namespace Lucene.Net.Codecs
                     if (ord >= arcs.Length)
                     {
                         FST.Arc<BytesRef>[] next = new FST.Arc<BytesRef>[ArrayUtil.Oversize(1 + ord, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                        Array.Copy(arcs, 0, next, 0, arcs.Length);
+                        Arrays.Copy(arcs, 0, next, 0, arcs.Length);
                         for (int arcOrd = arcs.Length; arcOrd < next.Length; arcOrd++)
                         {
                             next[arcOrd] = new FST.Arc<BytesRef>();
@@ -2689,7 +2689,7 @@ namespace Lucene.Net.Codecs
                         {
                             floorData = new byte[ArrayUtil.Oversize(numBytes, 1)];
                         }
-                        System.Buffer.BlockCopy(source.Bytes, source.Offset + @in.Position, floorData, 0, numBytes);
+                        Arrays.Copy(source.Bytes, source.Offset + @in.Position, floorData, 0, numBytes);
                         floorDataReader.Reset(floorData, 0, numBytes);
                         numFollowFloorBlocks = floorDataReader.ReadVInt32();
                         nextFloorLabel = floorDataReader.ReadByte() & 0xff;
@@ -3412,7 +3412,7 @@ namespace Lucene.Net.Codecs
                         {
                             outerInstance.term.Grow(termLength);
                         }
-                        System.Buffer.BlockCopy(suffixBytes, startBytePos, outerInstance.term.Bytes, prefix, suffix);
+                        Arrays.Copy(suffixBytes, startBytePos, outerInstance.term.Bytes, prefix, suffix);
                     }
                 }
             }
diff --git a/src/Lucene.Net/Codecs/Compressing/CompressingStoredFieldsReader.cs b/src/Lucene.Net/Codecs/Compressing/CompressingStoredFieldsReader.cs
index 08e98660c..18616a96e 100644
--- a/src/Lucene.Net/Codecs/Compressing/CompressingStoredFieldsReader.cs
+++ b/src/Lucene.Net/Codecs/Compressing/CompressingStoredFieldsReader.cs
@@ -421,12 +421,12 @@ namespace Lucene.Net.Codecs.Compressing
             {
                 while (len > outerInstance.bytes.Length)
                 {
-                    Array.Copy(outerInstance.bytes.Bytes, outerInstance.bytes.Offset, b, offset, outerInstance.bytes.Length);
+                    Arrays.Copy(outerInstance.bytes.Bytes, outerInstance.bytes.Offset, b, offset, outerInstance.bytes.Length);
                     len -= outerInstance.bytes.Length;
                     offset += outerInstance.bytes.Length;
                     FillBuffer();
                 }
-                Array.Copy(outerInstance.bytes.Bytes, outerInstance.bytes.Offset, b, offset, len);
+                Arrays.Copy(outerInstance.bytes.Bytes, outerInstance.bytes.Offset, b, offset, len);
                 outerInstance.bytes.Offset += len;
                 outerInstance.bytes.Length -= len;
             }
@@ -574,7 +574,7 @@ namespace Lucene.Net.Codecs.Compressing
                         int toDecompress = Math.Min(chunkSize - decompressed, outerInstance.chunkSize);
                         outerInstance.decompressor.Decompress(fieldsStream, toDecompress, 0, toDecompress, spare);
                         bytes.Bytes = ArrayUtil.Grow(bytes.Bytes, bytes.Length + spare.Length);
-                        Array.Copy(spare.Bytes, spare.Offset, bytes.Bytes, bytes.Length, spare.Length);
+                        Arrays.Copy(spare.Bytes, spare.Offset, bytes.Bytes, bytes.Length, spare.Length);
                         bytes.Length += spare.Length;
                         decompressed += toDecompress;
                     }
diff --git a/src/Lucene.Net/Codecs/Compressing/CompressingTermVectorsWriter.cs b/src/Lucene.Net/Codecs/Compressing/CompressingTermVectorsWriter.cs
index 81b51c9e1..52da95b3e 100644
--- a/src/Lucene.Net/Codecs/Compressing/CompressingTermVectorsWriter.cs
+++ b/src/Lucene.Net/Codecs/Compressing/CompressingTermVectorsWriter.cs
@@ -373,7 +373,7 @@ namespace Lucene.Net.Codecs.Compressing
             }
             lastTerm.Offset = 0;
             lastTerm.Length = term.Length;
-            Array.Copy(term.Bytes, term.Offset, lastTerm.Bytes, 0, term.Length);
+            Arrays.Copy(term.Bytes, term.Offset, lastTerm.Bytes, 0, term.Length);
         }
 
         public override void AddPosition(int position, int startOffset, int endOffset, BytesRef payload)
diff --git a/src/Lucene.Net/Codecs/Compressing/LZ4.cs b/src/Lucene.Net/Codecs/Compressing/LZ4.cs
index 9beb3aa9f..19ff38e01 100644
--- a/src/Lucene.Net/Codecs/Compressing/LZ4.cs
+++ b/src/Lucene.Net/Codecs/Compressing/LZ4.cs
@@ -164,7 +164,7 @@ namespace Lucene.Net.Codecs.Compressing
                 else
                 {
                     // no overlap -> arraycopy
-                    Array.Copy(dest, dOff - matchDec, dest, dOff, fastLen);
+                    Arrays.Copy(dest, dOff - matchDec, dest, dOff, fastLen);
                     dOff += matchLen;
                 }
             } while (dOff < decompressedLen);
diff --git a/src/Lucene.Net/Codecs/Lucene40/BitVector.cs b/src/Lucene.Net/Codecs/Lucene40/BitVector.cs
index e5114a14c..cfe4662fc 100644
--- a/src/Lucene.Net/Codecs/Lucene40/BitVector.cs
+++ b/src/Lucene.Net/Codecs/Lucene40/BitVector.cs
@@ -86,7 +86,7 @@ namespace Lucene.Net.Codecs.Lucene40
         public object Clone()
         {
             byte[] copyBits = new byte[bits.Length];
-            Array.Copy(bits, 0, copyBits, 0, bits.Length);
+            Arrays.Copy(bits, 0, copyBits, 0, bits.Length);
             BitVector clone = new BitVector(copyBits, size);
             clone.count = count;
             return clone;
diff --git a/src/Lucene.Net/Codecs/Lucene41/Lucene41PostingsWriter.cs b/src/Lucene.Net/Codecs/Lucene41/Lucene41PostingsWriter.cs
index b80cff9b4..27d3ac1ba 100644
--- a/src/Lucene.Net/Codecs/Lucene41/Lucene41PostingsWriter.cs
+++ b/src/Lucene.Net/Codecs/Lucene41/Lucene41PostingsWriter.cs
@@ -1,5 +1,6 @@
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
+using Lucene.Net.Support;
 using System;
 using System.Runtime.CompilerServices;
 
@@ -377,7 +378,7 @@ namespace Lucene.Net.Codecs.Lucene41
                     {
                         payloadBytes = ArrayUtil.Grow(payloadBytes, payloadByteUpto + payload.Length);
                     }
-                    Array.Copy(payload.Bytes, payload.Offset, payloadBytes, payloadByteUpto, payload.Length);
+                    Arrays.Copy(payload.Bytes, payload.Offset, payloadBytes, payloadByteUpto, payload.Length);
                     payloadByteUpto += payload.Length;
                 }
             }
diff --git a/src/Lucene.Net/Codecs/MultiLevelSkipListReader.cs b/src/Lucene.Net/Codecs/MultiLevelSkipListReader.cs
index a4c24ab2c..59624ae26 100644
--- a/src/Lucene.Net/Codecs/MultiLevelSkipListReader.cs
+++ b/src/Lucene.Net/Codecs/MultiLevelSkipListReader.cs
@@ -1,4 +1,5 @@
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Runtime.CompilerServices;
 
@@ -371,7 +372,7 @@ namespace Lucene.Net.Codecs
             [MethodImpl(MethodImplOptions.AggressiveInlining)]
             public override void ReadBytes(byte[] b, int offset, int len)
             {
-                Array.Copy(data, pos, b, offset, len);
+                Arrays.Copy(data, pos, b, offset, len);
                 pos += len;
             }
 
diff --git a/src/Lucene.Net/Index/AutomatonTermsEnum.cs b/src/Lucene.Net/Index/AutomatonTermsEnum.cs
index d1df0f007..85b93c40f 100644
--- a/src/Lucene.Net/Index/AutomatonTermsEnum.cs
+++ b/src/Lucene.Net/Index/AutomatonTermsEnum.cs
@@ -1,4 +1,5 @@
-using Lucene.Net.Diagnostics;
+using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 using System.Diagnostics;
@@ -187,7 +188,7 @@ namespace Lucene.Net.Index
             {
                 linearUpperBound.Bytes = new byte[length];
             }
-            Array.Copy(seekBytesRef.Bytes, 0, linearUpperBound.Bytes, 0, position);
+            Arrays.Copy(seekBytesRef.Bytes, 0, linearUpperBound.Bytes, 0, position);
             linearUpperBound.Bytes[position] = (byte)maxInterval;
             linearUpperBound.Length = length;
 
diff --git a/src/Lucene.Net/Index/ByteSliceReader.cs b/src/Lucene.Net/Index/ByteSliceReader.cs
index fbfbccff9..c32eff93c 100644
--- a/src/Lucene.Net/Index/ByteSliceReader.cs
+++ b/src/Lucene.Net/Index/ByteSliceReader.cs
@@ -1,4 +1,5 @@
-using Lucene.Net.Diagnostics;
+using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Diagnostics;
 
@@ -156,7 +157,7 @@ namespace Lucene.Net.Index
                 if (numLeft < len)
                 {
                     // Read entire slice
-                    Array.Copy(buffer, upto, b, offset, numLeft);
+                    Arrays.Copy(buffer, upto, b, offset, numLeft);
                     offset += numLeft;
                     len -= numLeft;
                     NextSlice();
@@ -164,7 +165,7 @@ namespace Lucene.Net.Index
                 else
                 {
                     // this slice is the last one
-                    Array.Copy(buffer, upto, b, offset, len);
+                    Arrays.Copy(buffer, upto, b, offset, len);
                     upto += len;
                     break;
                 }
diff --git a/src/Lucene.Net/Index/DocFieldProcessor.cs b/src/Lucene.Net/Index/DocFieldProcessor.cs
index 26aa3cae7..00a36d5bc 100644
--- a/src/Lucene.Net/Index/DocFieldProcessor.cs
+++ b/src/Lucene.Net/Index/DocFieldProcessor.cs
@@ -1,5 +1,6 @@
 using J2N.Text;
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 using System.Runtime.CompilerServices;
@@ -257,7 +258,7 @@ namespace Lucene.Net.Index
                     {
                         int newSize = fields.Length * 2;
                         DocFieldProcessorPerField[] newArray = new DocFieldProcessorPerField[newSize];
-                        Array.Copy(fields, 0, newArray, 0, fieldCount);
+                        Arrays.Copy(fields, 0, newArray, 0, fieldCount);
                         fields = newArray;
                     }
 
diff --git a/src/Lucene.Net/Index/DocFieldProcessorPerField.cs b/src/Lucene.Net/Index/DocFieldProcessorPerField.cs
index 94a5d244e..4d400d71e 100644
--- a/src/Lucene.Net/Index/DocFieldProcessorPerField.cs
+++ b/src/Lucene.Net/Index/DocFieldProcessorPerField.cs
@@ -1,4 +1,5 @@
-using System;
+using System;
+using Lucene.Net.Support;
 
 namespace Lucene.Net.Index
 {
@@ -49,7 +50,7 @@ namespace Lucene.Net.Index
             {
                 int newSize = ArrayUtil.Oversize(fieldCount + 1, RamUsageEstimator.NUM_BYTES_OBJECT_REF);
                 IIndexableField[] newArray = new IIndexableField[newSize];
-                Array.Copy(fields, 0, newArray, 0, fieldCount);
+                Arrays.Copy(fields, 0, newArray, 0, fieldCount);
                 fields = newArray;
             }
 
diff --git a/src/Lucene.Net/Index/DocTermOrds.cs b/src/Lucene.Net/Index/DocTermOrds.cs
index 71f0d5198..457f38aca 100644
--- a/src/Lucene.Net/Index/DocTermOrds.cs
+++ b/src/Lucene.Net/Index/DocTermOrds.cs
@@ -1,5 +1,6 @@
 using J2N.Numerics;
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 using JCG = J2N.Collections.Generic;
@@ -481,7 +482,7 @@ namespace Lucene.Net.Index
                                 // It should be safe to round up to the nearest 32 bits in any case.
                                 int newLen = (newend + 3) & unchecked((int)0xfffffffc); // 4 byte alignment
                                 var newarr = new sbyte[newLen];
-                                Array.Copy(arr, 0, newarr, 0, pos);
+                                Arrays.Copy(arr, 0, newarr, 0, pos);
                                 arr = newarr;
                                 bytes[doc] = newarr;
                             }
@@ -634,10 +635,10 @@ namespace Lucene.Net.Index
                                         newlen <<= 1;
                                     }
                                     var newtarget = new sbyte[newlen];
-                                    Array.Copy(target, 0, newtarget, 0, pos);
+                                    Arrays.Copy(target, 0, newtarget, 0, pos);
                                     target = newtarget;
                                 }
-                                Array.Copy(arr, 0, target, pos, len);
+                                Arrays.Copy(arr, 0, target, pos, len);
                                 pos += len + 1; // skip single byte at end and leave it 0 for terminator
                             }
                         }
@@ -647,7 +648,7 @@ namespace Lucene.Net.Index
                     if (pos < target.Length)
                     {
                         var newtarget = new sbyte[pos];
-                        Array.Copy(target, 0, newtarget, 0, pos);
+                        Arrays.Copy(target, 0, newtarget, 0, pos);
                         target = newtarget;
                     }
 
diff --git a/src/Lucene.Net/Index/FreqProxTermsWriterPerField.cs b/src/Lucene.Net/Index/FreqProxTermsWriterPerField.cs
index e98203d74..3197ece85 100644
--- a/src/Lucene.Net/Index/FreqProxTermsWriterPerField.cs
+++ b/src/Lucene.Net/Index/FreqProxTermsWriterPerField.cs
@@ -347,22 +347,22 @@ namespace Lucene.Net.Index
 
                 base.CopyTo(toArray, numToCopy);
 
-                Array.Copy(lastDocIDs, 0, to.lastDocIDs, 0, numToCopy);
-                Array.Copy(lastDocCodes, 0, to.lastDocCodes, 0, numToCopy);
+                Arrays.Copy(lastDocIDs, 0, to.lastDocIDs, 0, numToCopy);
+                Arrays.Copy(lastDocCodes, 0, to.lastDocCodes, 0, numToCopy);
                 if (lastPositions != null)
                 {
                     if (Debugging.AssertsEnabled) Debugging.Assert(to.lastPositions != null);
-                    Array.Copy(lastPositions, 0, to.lastPositions, 0, numToCopy);
+                    Arrays.Copy(lastPositions, 0, to.lastPositions, 0, numToCopy);
                 }
                 if (lastOffsets != null)
                 {
                     if (Debugging.AssertsEnabled) Debugging.Assert(to.lastOffsets != null);
-                    Array.Copy(lastOffsets, 0, to.lastOffsets, 0, numToCopy);
+                    Arrays.Copy(lastOffsets, 0, to.lastOffsets, 0, numToCopy);
                 }
                 if (termFreqs != null)
                 {
                     if (Debugging.AssertsEnabled) Debugging.Assert(to.termFreqs != null);
-                    Array.Copy(termFreqs, 0, to.termFreqs, 0, numToCopy);
+                    Arrays.Copy(termFreqs, 0, to.termFreqs, 0, numToCopy);
                 }
             }
 
diff --git a/src/Lucene.Net/Index/ParallelPostingsArray.cs b/src/Lucene.Net/Index/ParallelPostingsArray.cs
index 95c837064..638b502f1 100644
--- a/src/Lucene.Net/Index/ParallelPostingsArray.cs
+++ b/src/Lucene.Net/Index/ParallelPostingsArray.cs
@@ -1,4 +1,5 @@
-using System;
+using System;
+using Lucene.Net.Support;
 
 namespace Lucene.Net.Index
 {
@@ -59,9 +60,9 @@ namespace Lucene.Net.Index
 
         internal virtual void CopyTo(ParallelPostingsArray toArray, int numToCopy)
         {
-            Array.Copy(textStarts, 0, toArray.textStarts, 0, numToCopy);
-            Array.Copy(intStarts, 0, toArray.intStarts, 0, numToCopy);
-            Array.Copy(byteStarts, 0, toArray.byteStarts, 0, numToCopy);
+            Arrays.Copy(textStarts, 0, toArray.textStarts, 0, numToCopy);
+            Arrays.Copy(intStarts, 0, toArray.intStarts, 0, numToCopy);
+            Arrays.Copy(byteStarts, 0, toArray.byteStarts, 0, numToCopy);
         }
     }
 }
\ No newline at end of file
diff --git a/src/Lucene.Net/Index/StoredFieldsProcessor.cs b/src/Lucene.Net/Index/StoredFieldsProcessor.cs
index e3974164d..9cda0b79e 100644
--- a/src/Lucene.Net/Index/StoredFieldsProcessor.cs
+++ b/src/Lucene.Net/Index/StoredFieldsProcessor.cs
@@ -173,11 +173,11 @@ namespace Lucene.Net.Index
                 {
                     int newSize = ArrayUtil.Oversize(numStoredFields + 1, RamUsageEstimator.NUM_BYTES_OBJECT_REF);
                     IIndexableField[] newArray = new IIndexableField[newSize];
-                    Array.Copy(storedFields, 0, newArray, 0, numStoredFields);
+                    Arrays.Copy(storedFields, 0, newArray, 0, numStoredFields);
                     storedFields = newArray;
 
                     FieldInfo[] newInfoArray = new FieldInfo[newSize];
-                    Array.Copy(fieldInfos, 0, newInfoArray, 0, numStoredFields);
+                    Arrays.Copy(fieldInfos, 0, newInfoArray, 0, numStoredFields);
                     fieldInfos = newInfoArray;
                 }
 
diff --git a/src/Lucene.Net/Index/TermVectorsConsumer.cs b/src/Lucene.Net/Index/TermVectorsConsumer.cs
index e391fb00a..f309d7cbe 100644
--- a/src/Lucene.Net/Index/TermVectorsConsumer.cs
+++ b/src/Lucene.Net/Index/TermVectorsConsumer.cs
@@ -175,7 +175,7 @@ namespace Lucene.Net.Index
             {
                 int newSize = ArrayUtil.Oversize(numVectorFields + 1, RamUsageEstimator.NUM_BYTES_OBJECT_REF);
                 TermVectorsConsumerPerField[] newArray = new TermVectorsConsumerPerField[newSize];
-                Array.Copy(perFields, 0, newArray, 0, numVectorFields);
+                Arrays.Copy(perFields, 0, newArray, 0, numVectorFields);
                 perFields = newArray;
             }
 
diff --git a/src/Lucene.Net/Index/TermVectorsConsumerPerField.cs b/src/Lucene.Net/Index/TermVectorsConsumerPerField.cs
index d69bf0df5..87d43314d 100644
--- a/src/Lucene.Net/Index/TermVectorsConsumerPerField.cs
+++ b/src/Lucene.Net/Index/TermVectorsConsumerPerField.cs
@@ -346,9 +346,9 @@ namespace Lucene.Net.Index
 
                 base.CopyTo(toArray, numToCopy);
 
-                Array.Copy(freqs, 0, to.freqs, 0, size);
-                Array.Copy(lastOffsets, 0, to.lastOffsets, 0, size);
-                Array.Copy(lastPositions, 0, to.lastPositions, 0, size);
+                Arrays.Copy(freqs, 0, to.freqs, 0, size);
+                Arrays.Copy(lastOffsets, 0, to.lastOffsets, 0, size);
+                Arrays.Copy(lastPositions, 0, to.lastPositions, 0, size);
             }
 
             internal override int BytesPerPosting()
diff --git a/src/Lucene.Net/Lucene.Net.csproj b/src/Lucene.Net/Lucene.Net.csproj
index 5c7e3802a..2b00ffc25 100644
--- a/src/Lucene.Net/Lucene.Net.csproj
+++ b/src/Lucene.Net/Lucene.Net.csproj
@@ -32,6 +32,8 @@
     <!--<PackageReadmeFile>readme.md</PackageReadmeFile>-->
     <DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
     <NoWarn>$(NoWarn);1591;1573</NoWarn>
+
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 
   
diff --git a/src/Lucene.Net/Search/ConstantScoreAutoRewrite.cs b/src/Lucene.Net/Search/ConstantScoreAutoRewrite.cs
index 5d895ac2a..3495bbc5f 100644
--- a/src/Lucene.Net/Search/ConstantScoreAutoRewrite.cs
+++ b/src/Lucene.Net/Search/ConstantScoreAutoRewrite.cs
@@ -1,4 +1,5 @@
-using Lucene.Net.Diagnostics;
+using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 
 namespace Lucene.Net.Search
@@ -240,7 +241,7 @@ namespace Lucene.Net.Search
                 if (termState.Length < ord.Length)
                 {
                     TermContext[] tmpTermState = new TermContext[ArrayUtil.Oversize(ord.Length, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                    Array.Copy(termState, 0, tmpTermState, 0, termState.Length);
+                    Arrays.Copy(termState, 0, tmpTermState, 0, termState.Length);
                     termState = tmpTermState;
                 }
                 if (Debugging.AssertsEnabled) Debugging.Assert(termState.Length >= ord.Length);
diff --git a/src/Lucene.Net/Search/MinShouldMatchSumScorer.cs b/src/Lucene.Net/Search/MinShouldMatchSumScorer.cs
index ac0a5236c..e46b1b7e7 100644
--- a/src/Lucene.Net/Search/MinShouldMatchSumScorer.cs
+++ b/src/Lucene.Net/Search/MinShouldMatchSumScorer.cs
@@ -1,6 +1,7 @@
 using J2N;
 using J2N.Collections.Generic.Extensions;
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 using JCG = J2N.Collections.Generic;
@@ -219,7 +220,7 @@ namespace Lucene.Net.Search
                     if (mm - 2 - i > 0)
                     {
                         // shift RHS of array left
-                        Array.Copy(mmStack, i + 1, mmStack, i, mm - 2 - i);
+                        Arrays.Copy(mmStack, i + 1, mmStack, i, mm - 2 - i);
                     }
                     // find next most costly subScorer within heap TODO can this be done better?
                     while (!MinheapRemove(sortedSubScorers[sortedSubScorersIdx++]))
diff --git a/src/Lucene.Net/Search/MultiPhraseQuery.cs b/src/Lucene.Net/Search/MultiPhraseQuery.cs
index 6c2a8ffbf..857f34fc1 100644
--- a/src/Lucene.Net/Search/MultiPhraseQuery.cs
+++ b/src/Lucene.Net/Search/MultiPhraseQuery.cs
@@ -594,7 +594,7 @@ namespace Lucene.Net.Search
             private void GrowArray()
             {
                 var newArray = new int[_arraySize * 2];
-                Array.Copy(_array, 0, newArray, 0, _arraySize);
+                Arrays.Copy(_array, 0, newArray, 0, _arraySize);
                 _array = newArray;
                 _arraySize *= 2;
             }
diff --git a/src/Lucene.Net/Search/PhraseQuery.cs b/src/Lucene.Net/Search/PhraseQuery.cs
index f58ebdc29..b0fe262ce 100644
--- a/src/Lucene.Net/Search/PhraseQuery.cs
+++ b/src/Lucene.Net/Search/PhraseQuery.cs
@@ -209,7 +209,7 @@ namespace Lucene.Net.Search
                     else
                     {
                         Term[] terms2 = new Term[terms.Length];
-                        Array.Copy(terms, 0, terms2, 0, terms.Length);
+                        Arrays.Copy(terms, 0, terms2, 0, terms.Length);
                         Array.Sort(terms2);
                         this.terms = terms2;
                     }
diff --git a/src/Lucene.Net/Search/QueryRescorer.cs b/src/Lucene.Net/Search/QueryRescorer.cs
index f2538bb72..9f9c51820 100644
--- a/src/Lucene.Net/Search/QueryRescorer.cs
+++ b/src/Lucene.Net/Search/QueryRescorer.cs
@@ -1,5 +1,6 @@
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Util;
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 
@@ -135,7 +136,7 @@ namespace Lucene.Net.Search
             if (topN < hits.Length)
             {
                 ScoreDoc[] subset = new ScoreDoc[topN];
-                Array.Copy(hits, 0, subset, 0, topN);
+                Arrays.Copy(hits, 0, subset, 0, topN);
                 hits = subset;
             }
 
diff --git a/src/Lucene.Net/Search/ScoringRewrite.cs b/src/Lucene.Net/Search/ScoringRewrite.cs
index 56e467f03..102f7b7be 100644
--- a/src/Lucene.Net/Search/ScoringRewrite.cs
+++ b/src/Lucene.Net/Search/ScoringRewrite.cs
@@ -1,5 +1,6 @@
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Util;
+using Lucene.Net.Support;
 using System;
 
 namespace Lucene.Net.Search
@@ -217,7 +218,7 @@ namespace Lucene.Net.Search
                 if (termState.Length < ord.Length)
                 {
                     TermContext[] tmpTermState = new TermContext[ArrayUtil.Oversize(ord.Length, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                    Array.Copy(termState, 0, tmpTermState, 0, termState.Length);
+                    Arrays.Copy(termState, 0, tmpTermState, 0, termState.Length);
                     termState = tmpTermState;
                 }
                 if (Debugging.AssertsEnabled) Debugging.Assert(termState.Length >= ord.Length && boost.Length >= ord.Length);
diff --git a/src/Lucene.Net/Search/Spans/TermSpans.cs b/src/Lucene.Net/Search/Spans/TermSpans.cs
index 7a3fc24db..1cff26eb8 100644
--- a/src/Lucene.Net/Search/Spans/TermSpans.cs
+++ b/src/Lucene.Net/Search/Spans/TermSpans.cs
@@ -1,4 +1,5 @@
-using Lucene.Net.Diagnostics;
+using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 
@@ -111,7 +112,7 @@ namespace Lucene.Net.Search.Spans
             if (payload != null)
             {
                 bytes = new byte[payload.Length];
-                Array.Copy(payload.Bytes, payload.Offset, bytes, 0, payload.Length);
+                Arrays.Copy(payload.Bytes, payload.Offset, bytes, 0, payload.Length);
             }
             else
             {
diff --git a/src/Lucene.Net/Store/BufferedChecksum.cs b/src/Lucene.Net/Store/BufferedChecksum.cs
index 64e80fd10..6a2322728 100644
--- a/src/Lucene.Net/Store/BufferedChecksum.cs
+++ b/src/Lucene.Net/Store/BufferedChecksum.cs
@@ -91,7 +91,7 @@ namespace Lucene.Net.Store
                 {
                     Flush();
                 }
-                System.Buffer.BlockCopy(b, off, buffer, upto, len);
+                Arrays.Copy(b, off, buffer, upto, len);
                 upto += len;
             }
         }
diff --git a/src/Lucene.Net/Store/BufferedIndexInput.cs b/src/Lucene.Net/Store/BufferedIndexInput.cs
index c200fe4df..669d721ab 100644
--- a/src/Lucene.Net/Store/BufferedIndexInput.cs
+++ b/src/Lucene.Net/Store/BufferedIndexInput.cs
@@ -1,4 +1,5 @@
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.IO;
 using System.Runtime.CompilerServices;
@@ -102,7 +103,7 @@ namespace Lucene.Net.Store
                     {
                         numToCopy = leftInBuffer;
                     }
-                    Array.Copy(m_buffer, bufferPosition, newBuffer, 0, numToCopy);
+                    Arrays.Copy(m_buffer, bufferPosition, newBuffer, 0, numToCopy);
                     bufferStart += bufferPosition;
                     bufferPosition = 0;
                     bufferLength = numToCopy;
@@ -147,7 +148,7 @@ namespace Lucene.Net.Store
                 // the buffer contains enough data to satisfy this request
                 if (len > 0) // to allow b to be null if len is 0...
                 {
-                    Buffer.BlockCopy(m_buffer, bufferPosition, b, offset, len);
+                    Arrays.Copy(m_buffer, bufferPosition, b, offset, len);
                 }
                 bufferPosition += len;
             }
@@ -156,7 +157,7 @@ namespace Lucene.Net.Store
                 // the buffer does not have enough data. First serve all we've got.
                 if (available > 0)
                 {
-                    Buffer.BlockCopy(m_buffer, bufferPosition, b, offset, available);
+                    Arrays.Copy(m_buffer, bufferPosition, b, offset, available);
                     offset += available;
                     len -= available;
                     bufferPosition += available;
@@ -171,12 +172,12 @@ namespace Lucene.Net.Store
                     if (bufferLength < len)
                     {
                         // Throw an exception when refill() could not read len bytes:
-                        Buffer.BlockCopy(m_buffer, 0, b, offset, bufferLength);
+                        Arrays.Copy(m_buffer, 0, b, offset, bufferLength);
                         throw EOFException.Create("read past EOF: " + this);
                     }
                     else
                     {
-                        Buffer.BlockCopy(m_buffer, 0, b, offset, len);
+                        Arrays.Copy(m_buffer, 0, b, offset, len);
                         bufferPosition = len;
                     }
                 }
diff --git a/src/Lucene.Net/Store/BufferedIndexOutput.cs b/src/Lucene.Net/Store/BufferedIndexOutput.cs
index 9dae04058..6867c0a40 100644
--- a/src/Lucene.Net/Store/BufferedIndexOutput.cs
+++ b/src/Lucene.Net/Store/BufferedIndexOutput.cs
@@ -83,7 +83,7 @@ namespace Lucene.Net.Store
             if (bytesLeft >= length)
             {
                 // we add the data to the end of the buffer
-                System.Buffer.BlockCopy(b, offset, buffer, bufferPosition, length);
+                Arrays.Copy(b, offset, buffer, bufferPosition, length);
                 bufferPosition += length;
                 // if the buffer is full, flush it
                 if (bufferSize - bufferPosition == 0)
@@ -114,7 +114,7 @@ namespace Lucene.Net.Store
                     while (pos < length)
                     {
                         pieceLength = (length - pos < bytesLeft) ? length - pos : bytesLeft;
-                        System.Buffer.BlockCopy(b, pos + offset, buffer, bufferPosition, pieceLength);
+                        Arrays.Copy(b, pos + offset, buffer, bufferPosition, pieceLength);
                         pos += pieceLength;
                         bufferPosition += pieceLength;
                         // if the buffer is full, flush it
diff --git a/src/Lucene.Net/Store/ByteArrayDataInput.cs b/src/Lucene.Net/Store/ByteArrayDataInput.cs
index e4a50ab0c..ea8799efe 100644
--- a/src/Lucene.Net/Store/ByteArrayDataInput.cs
+++ b/src/Lucene.Net/Store/ByteArrayDataInput.cs
@@ -1,4 +1,5 @@
-using System;
+using Lucene.Net.Support;
+using System;
 
 namespace Lucene.Net.Store
 {
@@ -227,7 +228,7 @@ namespace Lucene.Net.Store
         // NOTE: AIOOBE not EOF if you read too much
         public override void ReadBytes(byte[] b, int offset, int len)
         {
-            Buffer.BlockCopy(bytes, pos, b, offset, len);
+            Arrays.Copy(bytes, pos, b, offset, len);
             pos += len;
         }
     }
diff --git a/src/Lucene.Net/Store/ByteArrayDataOutput.cs b/src/Lucene.Net/Store/ByteArrayDataOutput.cs
index cbdf7af6a..99642f93b 100644
--- a/src/Lucene.Net/Store/ByteArrayDataOutput.cs
+++ b/src/Lucene.Net/Store/ByteArrayDataOutput.cs
@@ -1,4 +1,5 @@
-using Lucene.Net.Diagnostics;
+using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 
 namespace Lucene.Net.Store
 {
@@ -73,7 +74,7 @@ namespace Lucene.Net.Store
         public override void WriteBytes(byte[] b, int offset, int length)
         {
             if (Debugging.AssertsEnabled) Debugging.Assert(pos + length <= limit);
-            System.Buffer.BlockCopy(b, offset, bytes, pos, length);
+            Arrays.Copy(b, offset, bytes, pos, length);
             pos += length;
         }
     }
diff --git a/src/Lucene.Net/Store/RAMInputStream.cs b/src/Lucene.Net/Store/RAMInputStream.cs
index d2de59969..355a9d6f5 100644
--- a/src/Lucene.Net/Store/RAMInputStream.cs
+++ b/src/Lucene.Net/Store/RAMInputStream.cs
@@ -1,4 +1,5 @@
-using System;
+using Lucene.Net.Support;
+using System;
 using System.IO;
 
 namespace Lucene.Net.Store
@@ -84,7 +85,7 @@ namespace Lucene.Net.Store
 
                 int remainInBuffer = bufferLength - bufferPosition;
                 int bytesToCopy = len < remainInBuffer ? len : remainInBuffer;
-                System.Array.Copy(currentBuffer, bufferPosition, b, offset, bytesToCopy);
+                Arrays.Copy(currentBuffer, bufferPosition, b, offset, bytesToCopy);
                 offset += bytesToCopy;
                 len -= bytesToCopy;
                 bufferPosition += bytesToCopy;
diff --git a/src/Lucene.Net/Store/RAMOutputStream.cs b/src/Lucene.Net/Store/RAMOutputStream.cs
index 1c5ccd88b..eccab0bf4 100644
--- a/src/Lucene.Net/Store/RAMOutputStream.cs
+++ b/src/Lucene.Net/Store/RAMOutputStream.cs
@@ -99,7 +99,7 @@ namespace Lucene.Net.Store
                 {
                     length = (int)(end - pos);
                 }
-                System.Buffer.BlockCopy(file.GetBuffer(buffer++), 0, bytes, bytesUpto, length);
+                Arrays.Copy(file.GetBuffer(buffer++), 0, bytes, bytesUpto, length);
                 bytesUpto += length;
                 pos = nextPos;
             }
@@ -174,7 +174,7 @@ namespace Lucene.Net.Store
 
                 int remainInBuffer = currentBuffer.Length - bufferPosition;
                 int bytesToCopy = len < remainInBuffer ? len : remainInBuffer;
-                System.Buffer.BlockCopy(b, offset, currentBuffer, bufferPosition, bytesToCopy);
+                Arrays.Copy(b, offset, currentBuffer, bufferPosition, bytesToCopy);
                 offset += bytesToCopy;
                 len -= bytesToCopy;
                 bufferPosition += bytesToCopy;
diff --git a/src/Lucene.Net/Support/Arrays.cs b/src/Lucene.Net/Support/Arrays.cs
index 2cddb06f0..38b1c0547 100644
--- a/src/Lucene.Net/Support/Arrays.cs
+++ b/src/Lucene.Net/Support/Arrays.cs
@@ -1,7 +1,10 @@
 using J2N.Collections;
+using Lucene.Net.Diagnostics;
+using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
 using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
 using System.Text;
 
 namespace Lucene.Net.Support
@@ -116,6 +119,425 @@ namespace Lucene.Net.Support
             }
         }
 
+        /// <summary>
+        /// Copies a range of elements from an Array starting at the first element and pastes them
+        /// into another Array starting at the first element. The length is specified as a 32-bit integer.
+        /// <para/>
+        /// <b>Usage Note:</b> This implementation uses the most efficient (known) method for copying the
+        /// array based on the data type and platform.
+        /// </summary>
+        /// <typeparam name="T">The array type.</typeparam>
+        /// <param name="sourceArray">The Array that contains the data to copy.</param>
+        /// <param name="destinationArray">The Array that receives the data.</param>
+        /// <param name="length">A 32-bit integer that represents the number of elements to copy.</param>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static void Copy<T>(T[] sourceArray, T[] destinationArray, int length)
+        {
+            if (length == 0)
+                return;
+
+            if (Debugging.AssertsEnabled) // LUCENENET: Since this is internal, we are relying on Debugging.Assert to ensure the values passed in are correct.
+            {
+                Debugging.Assert(sourceArray is not null);
+                Debugging.Assert(destinationArray is not null);
+                Debugging.Assert(length >= 0 || length <= sourceArray.Length || length <= destinationArray.Length);
+            }
+
+            ArrayCopier<T>.Default.Copy(sourceArray, sourceIndex: 0, destinationArray, destinationIndex: 0, length);
+        }
+
+        /// <summary>
+        /// Copies a range of elements from an Array starting at the specified source index and pastes them
+        /// to another Array starting at the specified destination index. The length and the indexes are
+        /// specified as 32-bit integers.
+        /// <para/>
+        /// <b>Usage Note:</b> This implementation uses the most efficient (known) method for copying the
+        /// array based on the data type and platform.
+        /// </summary>
+        /// <typeparam name="T">The array type.</typeparam>
+        /// <param name="sourceArray">The Array that contains the data to copy.</param>
+        /// <param name="sourceIndex">A 32-bit integer that represents the index in the
+        /// <paramref name="sourceArray"/> at which copying begins.</param>
+        /// <param name="destinationArray">The Array that receives the data.</param>
+        /// <param name="destinationIndex">A 32-bit integer that represents the index in the
+        /// <paramref name="destinationArray"/> at which storing begins.</param>
+        /// <param name="length">A 32-bit integer that represents the number of elements to copy.</param>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static void Copy<T>(T[] sourceArray, int sourceIndex, T[] destinationArray, int destinationIndex, int length)
+        {
+            if (length == 0)
+                return;
+
+            if (Debugging.AssertsEnabled) // LUCENENET: Since this is internal, we are relying on Debugging.Assert to ensure the values passed in are correct.
+            {
+                Debugging.Assert(sourceArray is not null);
+                Debugging.Assert(destinationArray is not null);
+                Debugging.Assert(sourceIndex >= 0 || sourceIndex <= sourceArray.Length - length);
+                Debugging.Assert(destinationIndex >= 0 || destinationIndex <= destinationArray.Length - length);
+                Debugging.Assert(length >= 0 || length < sourceArray.Length || length < destinationArray.Length);
+            }
+
+            ArrayCopier<T>.Default.Copy(sourceArray, sourceIndex, destinationArray, destinationIndex, length);
+        }
+
+        private class PlatformDetection
+        {
+            // We put this in its own class so every type doesn't have to reload it. But, at the same time,
+            // we don't want to have to load this just to use the Arrays class.
+            public static readonly bool IsFullFramework = LoadIsFullFramework();
+            //public static readonly bool IsNetNative = RuntimeInformation.FrameworkDescription.StartsWith(".NET Native", StringComparison.OrdinalIgnoreCase);
+            public static readonly bool IsNetCore = LoadIsNetCore();
+
+            private static bool LoadIsFullFramework()
+            {
+#if NETSTANDARD2_0
+                return RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework", StringComparison.OrdinalIgnoreCase);
+#elif NET40_OR_GREATER
+                return true;
+#else
+                return false;
+#endif
+            }
+
+            private static bool LoadIsNetCore()
+            {
+#if NETSTANDARD2_0_OR_GREATER
+                return RuntimeInformation.FrameworkDescription.StartsWith(".NET Core", StringComparison.OrdinalIgnoreCase);
+#elif NET5_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER
+                return true;
+#else
+                return false;
+#endif
+            }
+        }
+
+        #region ArrayCopier<T>
+
+        private class ArrayCopier<T>
+        {
+            public static readonly IArrayCopier<T> Default = LoadArrayCopier();
+
+            private static IArrayCopier<T> LoadArrayCopier()
+            {
+                // Default to Array.Copy() for unknown platforms (Span<T>.Copy() is slow on Mono)
+                if (!PlatformDetection.IsFullFramework && !PlatformDetection.IsNetCore)
+                    return new SystemArrayCopyArrayCopier<T>();
+
+                var type = typeof(T);
+
+                if (!type.IsValueType) // Reference types
+                {
+                    // Span<T> and Memory<T> are horribly slow on.NET Framework for
+                    // copying arrays of reference types.
+                    if (PlatformDetection.IsFullFramework)
+                        return new SystemArrayCopyArrayCopier<T>();
+
+                    return new SpanArrayCopier<T>();
+                }
+
+                // Value types are generally tied with or faster than Buffer.MemoryCopy() using
+                // Span<T>.Copy() on Linux and macOS.
+                if (!Constants.WINDOWS && !PlatformDetection.IsFullFramework)
+                    return new SpanArrayCopier<T>();
+
+                if (type == typeof(byte))
+                {
+                    // On Windows, copying bytes with Buffer.MemoryCopy() is fastest.
+                    return (IArrayCopier<T>)(object)new ByteBufferMemoryCopyArrayCopier();
+                }
+                else if (type == typeof(sbyte))
+                {
+                    return (IArrayCopier<T>)(object)new SByteBufferMemoryCopyArrayCopier();
+                }
+                else if (PlatformDetection.IsFullFramework)
+                {
+                    // .NET Framework is 2-3x faster to use Buffer.MemoryCopy() than any other method for primitive types.
+                    if (type == typeof(short))
+                        return (IArrayCopier<T>)(object)new Int16BufferMemoryCopyArrayCopier();
+                    if (type == typeof(ushort))
+                        return (IArrayCopier<T>)(object)new UInt16BufferMemoryCopyArrayCopier();
+                    if (type == typeof(int))
+                        return (IArrayCopier<T>)(object)new Int32BufferMemoryCopyArrayCopier();
+                    if (type == typeof(uint))
+                        return (IArrayCopier<T>)(object)new UInt32BufferMemoryCopyArrayCopier();
+                    if (type == typeof(long))
+                        return (IArrayCopier<T>)(object)new Int64BufferMemoryCopyArrayCopier();
+                    if (type == typeof(ulong))
+                        return (IArrayCopier<T>)(object)new UInt64BufferMemoryCopyArrayCopier();
+                    if (type == typeof(float))
+                        return (IArrayCopier<T>)(object)new SingleBufferMemoryCopyArrayCopier();
+                    if (type == typeof(double))
+                        return (IArrayCopier<T>)(object)new DoubleBufferMemoryCopyArrayCopier();
+                    if (type == typeof(char))
+                        return (IArrayCopier<T>)(object)new CharBufferMemoryCopyArrayCopier();
+                    if (type == typeof(bool))
+                        return (IArrayCopier<T>)(object)new BooleanBufferMemoryCopyArrayCopier();
+
+                    return new SystemArrayCopyArrayCopier<T>();
+                }
+                else
+                {
+                    return new SpanArrayCopier<T>();
+                }
+            }
+        }
+
+        private interface IArrayCopier<T>
+        {
+            void Copy(T[] sourceArray, int sourceIndex, T[] destinationArray, int destinationIndex, int length);
+        }
+
+        private class SpanArrayCopier<T> : IArrayCopier<T>
+        {
+            public void Copy(T[] sourceArray, int sourceIndex, T[] destinationArray, int destinationIndex, int length)
+            {
+                sourceArray.AsSpan(sourceIndex, length).CopyTo(destinationArray.AsSpan(destinationIndex, length));
+            }
+        }
+
+        private class SystemArrayCopyArrayCopier<T> : IArrayCopier<T>
+        {
+            public void Copy(T[] sourceArray, int sourceIndex, T[] destinationArray, int destinationIndex, int length)
+            {
+                Array.Copy(sourceArray, sourceIndex, destinationArray, destinationIndex, length);
+            }
+        }
+
+        #region Primitive Type Buffer.MemoryCopy() Array Copiers
+        // We save some arithmetic by having a specialized type for byte, since we know it is measured in bytes.
+        private class ByteBufferMemoryCopyArrayCopier : IArrayCopier<byte>
+        {
+            public void Copy(byte[] sourceArray, int sourceIndex, byte[] destinationArray, int destinationIndex, int length)
+            {
+                unsafe
+                {
+                    fixed (byte* sourcePointer = &sourceArray[sourceIndex], destinationPointer = &destinationArray[destinationIndex])
+                    {
+                        // NOTE: We are relying on the fact that passing the pointers into this method is creating copies of them
+                        // that are not fixed.
+                        Buffer.MemoryCopy(sourcePointer, destinationPointer, destinationArray.Length - destinationIndex, length);
+                    }
+                }
+            }
+        }
+
+        // We save some arithmetic by having a specialized type for byte, since we know it is measured in bytes.
+        private class SByteBufferMemoryCopyArrayCopier : IArrayCopier<sbyte>
+        {
+            public void Copy(sbyte[] sourceArray, int sourceIndex, sbyte[] destinationArray, int destinationIndex, int length)
+            {
+                unsafe
+                {
+                    fixed (sbyte* sourcePointer = &sourceArray[sourceIndex], destinationPointer = &destinationArray[destinationIndex])
+                    {
+                        // NOTE: We are relying on the fact that passing the pointers into this method is creating copies of them
+                        // that are not fixed.
+                        Buffer.MemoryCopy(sourcePointer, destinationPointer, destinationArray.Length - destinationIndex, length);
+                    }
+                }
+            }
+        }
+
+        // LUCENENET NOTE: Tried to make the following types one generic type, but SDKs prior to .NET 7 won't compile it.
+        // See: https://github.com/dotnet/runtime/issues/76255
+
+        private class Int16BufferMemoryCopyArrayCopier : IArrayCopier<short>
+        {
+            public void Copy(short[] sourceArray, int sourceIndex, short[] destinationArray, int destinationIndex, int length)
+            {
+                unsafe
+                {
+                    fixed (short* sourcePointer = &sourceArray[sourceIndex], destinationPointer = &destinationArray[destinationIndex])
+                    {
+                        int size = sizeof(short);
+                        long destinationSizeInBytes = (destinationArray.Length - destinationIndex) * size;
+                        long sourceBytesToCopy = length * size;
+                        // NOTE: We are relying on the fact that passing the pointers into this method is creating copies of them
+                        // that are not fixed.
+                        Buffer.MemoryCopy(sourcePointer, destinationPointer, destinationSizeInBytes, sourceBytesToCopy);
+                    }
+                }
+            }
+        }
+
+        private class UInt16BufferMemoryCopyArrayCopier : IArrayCopier<ushort>
+        {
+            public void Copy(ushort[] sourceArray, int sourceIndex, ushort[] destinationArray, int destinationIndex, int length)
+            {
+                unsafe
+                {
+                    fixed (ushort* sourcePointer = &sourceArray[sourceIndex], destinationPointer = &destinationArray[destinationIndex])
+                    {
+                        int size = sizeof(ushort);
+                        long destinationSizeInBytes = (destinationArray.Length - destinationIndex) * size;
+                        long sourceBytesToCopy = length * size;
+                        // NOTE: We are relying on the fact that passing the pointers into this method is creating copies of them
+                        // that are not fixed.
+                        Buffer.MemoryCopy(sourcePointer, destinationPointer, destinationSizeInBytes, sourceBytesToCopy);
+                    }
+                }
+            }
+        }
+
+        private class Int32BufferMemoryCopyArrayCopier : IArrayCopier<int>
+        {
+            public void Copy(int[] sourceArray, int sourceIndex, int[] destinationArray, int destinationIndex, int length)
+            {
+                unsafe
+                {
+                    fixed (int* sourcePointer = &sourceArray[sourceIndex], destinationPointer = &destinationArray[destinationIndex])
+                    {
+                        int size = sizeof(int);
+                        long destinationSizeInBytes = (destinationArray.Length - destinationIndex) * size;
+                        long sourceBytesToCopy = length * size;
+                        // NOTE: We are relying on the fact that passing the pointers into this method is creating copies of them
+                        // that are not fixed.
+                        Buffer.MemoryCopy(sourcePointer, destinationPointer, destinationSizeInBytes, sourceBytesToCopy);
+                    }
+                }
+            }
+        }
+
+        private class UInt32BufferMemoryCopyArrayCopier : IArrayCopier<uint>
+        {
+            public void Copy(uint[] sourceArray, int sourceIndex, uint[] destinationArray, int destinationIndex, int length)
+            {
+                unsafe
+                {
+                    fixed (uint* sourcePointer = &sourceArray[sourceIndex], destinationPointer = &destinationArray[destinationIndex])
+                    {
+                        int size = sizeof(uint);
+                        long destinationSizeInBytes = (destinationArray.Length - destinationIndex) * size;
+                        long sourceBytesToCopy = length * size;
+                        // NOTE: We are relying on the fact that passing the pointers into this method is creating copies of them
+                        // that are not fixed.
+                        Buffer.MemoryCopy(sourcePointer, destinationPointer, destinationSizeInBytes, sourceBytesToCopy);
+                    }
+                }
+            }
+        }
+
+        private class Int64BufferMemoryCopyArrayCopier : IArrayCopier<long>
+        {
+            public void Copy(long[] sourceArray, int sourceIndex, long[] destinationArray, int destinationIndex, int length)
+            {
+                unsafe
+                {
+                    fixed (long* sourcePointer = &sourceArray[sourceIndex], destinationPointer = &destinationArray[destinationIndex])
+                    {
+                        int size = sizeof(long);
+                        long destinationSizeInBytes = (destinationArray.Length - destinationIndex) * size;
+                        long sourceBytesToCopy = length * size;
+                        // NOTE: We are relying on the fact that passing the pointers into this method is creating copies of them
+                        // that are not fixed.
+                        Buffer.MemoryCopy(sourcePointer, destinationPointer, destinationSizeInBytes, sourceBytesToCopy);
+                    }
+                }
+            }
+        }
+
+        private class UInt64BufferMemoryCopyArrayCopier : IArrayCopier<ulong>
+        {
+            public void Copy(ulong[] sourceArray, int sourceIndex, ulong[] destinationArray, int destinationIndex, int length)
+            {
+                unsafe
+                {
+                    fixed (ulong* sourcePointer = &sourceArray[sourceIndex], destinationPointer = &destinationArray[destinationIndex])
+                    {
+                        int size = sizeof(ulong);
+                        long destinationSizeInBytes = (destinationArray.Length - destinationIndex) * size;
+                        long sourceBytesToCopy = length * size;
+                        // NOTE: We are relying on the fact that passing the pointers into this method is creating copies of them
+                        // that are not fixed.
+                        Buffer.MemoryCopy(sourcePointer, destinationPointer, destinationSizeInBytes, sourceBytesToCopy);
+                    }
+                }
+            }
+        }
+
+        private class SingleBufferMemoryCopyArrayCopier : IArrayCopier<float>
+        {
+            public void Copy(float[] sourceArray, int sourceIndex, float[] destinationArray, int destinationIndex, int length)
+            {
+                unsafe
+                {
+                    fixed (float* sourcePointer = &sourceArray[sourceIndex], destinationPointer = &destinationArray[destinationIndex])
+                    {
+                        int size = sizeof(float);
+                        long destinationSizeInBytes = (destinationArray.Length - destinationIndex) * size;
+                        long sourceBytesToCopy = length * size;
+                        // NOTE: We are relying on the fact that passing the pointers into this method is creating copies of them
+                        // that are not fixed.
+                        Buffer.MemoryCopy(sourcePointer, destinationPointer, destinationSizeInBytes, sourceBytesToCopy);
+                    }
+                }
+            }
+        }
+
+        private class DoubleBufferMemoryCopyArrayCopier : IArrayCopier<double>
+        {
+            public void Copy(double[] sourceArray, int sourceIndex, double[] destinationArray, int destinationIndex, int length)
+            {
+                unsafe
+                {
+                    fixed (double* sourcePointer = &sourceArray[sourceIndex], destinationPointer = &destinationArray[destinationIndex])
+                    {
+                        int size = sizeof(double);
+                        long destinationSizeInBytes = (destinationArray.Length - destinationIndex) * size;
+                        long sourceBytesToCopy = length * size;
+                        // NOTE: We are relying on the fact that passing the pointers into this method is creating copies of them
+                        // that are not fixed.
+                        Buffer.MemoryCopy(sourcePointer, destinationPointer, destinationSizeInBytes, sourceBytesToCopy);
+                    }
+                }
+            }
+        }
+
+        private class CharBufferMemoryCopyArrayCopier : IArrayCopier<char>
+        {
+            public void Copy(char[] sourceArray, int sourceIndex, char[] destinationArray, int destinationIndex, int length)
+            {
+                unsafe
+                {
+                    fixed (char* sourcePointer = &sourceArray[sourceIndex], destinationPointer = &destinationArray[destinationIndex])
+                    {
+                        int size = sizeof(char);
+                        long destinationSizeInBytes = (destinationArray.Length - destinationIndex) * size;
+                        long sourceBytesToCopy = length * size;
+                        // NOTE: We are relying on the fact that passing the pointers into this method is creating copies of them
+                        // that are not fixed.
+                        Buffer.MemoryCopy(sourcePointer, destinationPointer, destinationSizeInBytes, sourceBytesToCopy);
+                    }
+                }
+            }
+        }
+
+        private class BooleanBufferMemoryCopyArrayCopier : IArrayCopier<bool>
+        {
+            public void Copy(bool[] sourceArray, int sourceIndex, bool[] destinationArray, int destinationIndex, int length)
+            {
+                unsafe
+                {
+                    fixed (bool* sourcePointer = &sourceArray[sourceIndex], destinationPointer = &destinationArray[destinationIndex])
+                    {
+                        int size = sizeof(bool);
+                        long destinationSizeInBytes = (destinationArray.Length - destinationIndex) * size;
+                        long sourceBytesToCopy = length * size;
+                        // NOTE: We are relying on the fact that passing the pointers into this method is creating copies of them
+                        // that are not fixed.
+                        Buffer.MemoryCopy(sourcePointer, destinationPointer, destinationSizeInBytes, sourceBytesToCopy);
+                    }
+                }
+            }
+        }
+
+        // Intentionally not adding support for IntPtr and UIntPtr
+
+        #endregion Primitive Type Buffer.MemoryCopy() Array Copiers
+
+        #endregion ArrayCopier<T>
+
+
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public static T[] CopyOf<T>(T[] original, int newLength)
         {
diff --git a/src/Lucene.Net/Support/ConcurrentHashSet.cs b/src/Lucene.Net/Support/ConcurrentHashSet.cs
index 3ac70874d..dd79ead7f 100644
--- a/src/Lucene.Net/Support/ConcurrentHashSet.cs
+++ b/src/Lucene.Net/Support/ConcurrentHashSet.cs
@@ -652,7 +652,7 @@ namespace Lucene.Net.Support
                 if (_growLockArray && tables.Locks.Length < MaxLockNumber)
                 {
                     newLocks = new object[tables.Locks.Length * 2];
-                    Array.Copy(tables.Locks, 0, newLocks, 0, tables.Locks.Length);
+                    Arrays.Copy(tables.Locks, 0, newLocks, 0, tables.Locks.Length);
                     for (var i = tables.Locks.Length; i < newLocks.Length; i++)
                     {
                         newLocks[i] = new object();
diff --git a/src/Lucene.Net/Util/ArrayTimSorter.cs b/src/Lucene.Net/Util/ArrayTimSorter.cs
index 04463926b..e104ce242 100644
--- a/src/Lucene.Net/Util/ArrayTimSorter.cs
+++ b/src/Lucene.Net/Util/ArrayTimSorter.cs
@@ -1,3 +1,4 @@
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 using System.Runtime.CompilerServices;
@@ -71,7 +72,7 @@ namespace Lucene.Net.Util
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         protected override void Save(int start, int len)
         {
-            Array.Copy(arr, start, tmp, 0, len);
+            Arrays.Copy(arr, start, tmp, 0, len);
         }
 
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
diff --git a/src/Lucene.Net/Util/ArrayUtil.cs b/src/Lucene.Net/Util/ArrayUtil.cs
index 31ee07a85..2694f189d 100644
--- a/src/Lucene.Net/Util/ArrayUtil.cs
+++ b/src/Lucene.Net/Util/ArrayUtil.cs
@@ -1,4 +1,5 @@
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 using System.Runtime.CompilerServices;
@@ -277,7 +278,7 @@ namespace Lucene.Net.Util
             if (array.Length < minSize)
             {
                 short[] newArray = new short[Oversize(minSize, RamUsageEstimator.NUM_BYTES_INT16)];
-                Array.Copy(array, 0, newArray, 0, array.Length);
+                Arrays.Copy(array, 0, newArray, 0, array.Length);
                 return newArray;
             }
             else
@@ -298,7 +299,7 @@ namespace Lucene.Net.Util
             if (array.Length < minSize)
             {
                 float[] newArray = new float[Oversize(minSize, RamUsageEstimator.NUM_BYTES_SINGLE)];
-                Array.Copy(array, 0, newArray, 0, array.Length);
+                Arrays.Copy(array, 0, newArray, 0, array.Length);
                 return newArray;
             }
             else
@@ -319,7 +320,7 @@ namespace Lucene.Net.Util
             if (array.Length < minSize)
             {
                 double[] newArray = new double[Oversize(minSize, RamUsageEstimator.NUM_BYTES_DOUBLE)];
-                Array.Copy(array, 0, newArray, 0, array.Length);
+                Arrays.Copy(array, 0, newArray, 0, array.Length);
                 return newArray;
             }
             else
@@ -341,7 +342,7 @@ namespace Lucene.Net.Util
             if (newSize != array.Length)
             {
                 short[] newArray = new short[newSize];
-                Array.Copy(array, 0, newArray, 0, newSize);
+                Arrays.Copy(array, 0, newArray, 0, newSize);
                 return newArray;
             }
             else
@@ -356,7 +357,7 @@ namespace Lucene.Net.Util
             if (array.Length < minSize)
             {
                 int[] newArray = new int[Oversize(minSize, RamUsageEstimator.NUM_BYTES_INT32)];
-                Array.Copy(array, 0, newArray, 0, array.Length);
+                Arrays.Copy(array, 0, newArray, 0, array.Length);
                 return newArray;
             }
             else
@@ -378,7 +379,7 @@ namespace Lucene.Net.Util
             if (newSize != array.Length)
             {
                 int[] newArray = new int[newSize];
-                Array.Copy(array, 0, newArray, 0, newSize);
+                Arrays.Copy(array, 0, newArray, 0, newSize);
                 return newArray;
             }
             else
@@ -393,7 +394,7 @@ namespace Lucene.Net.Util
             if (array.Length < minSize)
             {
                 long[] newArray = new long[Oversize(minSize, RamUsageEstimator.NUM_BYTES_INT64)];
-                Array.Copy(array, 0, newArray, 0, array.Length);
+                Arrays.Copy(array, 0, newArray, 0, array.Length);
                 return newArray;
             }
             else
@@ -415,7 +416,7 @@ namespace Lucene.Net.Util
             if (newSize != array.Length)
             {
                 long[] newArray = new long[newSize];
-                Array.Copy(array, 0, newArray, 0, newSize);
+                Arrays.Copy(array, 0, newArray, 0, newSize);
                 return newArray;
             }
             else
@@ -431,7 +432,7 @@ namespace Lucene.Net.Util
             if (array.Length < minSize)
             {
                 var newArray = new sbyte[Oversize(minSize, 1)];
-                Array.Copy(array, 0, newArray, 0, array.Length);
+                Arrays.Copy(array, 0, newArray, 0, array.Length);
                 return newArray;
             }
             else
@@ -446,7 +447,7 @@ namespace Lucene.Net.Util
             if (array.Length < minSize)
             {
                 byte[] newArray = new byte[Oversize(minSize, 1)];
-                Array.Copy(array, 0, newArray, 0, array.Length);
+                Arrays.Copy(array, 0, newArray, 0, array.Length);
                 return newArray;
             }
             else
@@ -468,7 +469,7 @@ namespace Lucene.Net.Util
             if (newSize != array.Length)
             {
                 var newArray = new byte[newSize];
-                Array.Copy(array, 0, newArray, 0, newSize);
+                Arrays.Copy(array, 0, newArray, 0, newSize);
                 return newArray;
             }
             else
@@ -483,7 +484,7 @@ namespace Lucene.Net.Util
             if (array.Length < minSize)
             {
                 bool[] newArray = new bool[Oversize(minSize, 1)];
-                Array.Copy(array, 0, newArray, 0, array.Length);
+                Arrays.Copy(array, 0, newArray, 0, array.Length);
                 return newArray;
             }
             else
@@ -505,7 +506,7 @@ namespace Lucene.Net.Util
             if (newSize != array.Length)
             {
                 bool[] newArray = new bool[newSize];
-                Array.Copy(array, 0, newArray, 0, newSize);
+                Arrays.Copy(array, 0, newArray, 0, newSize);
                 return newArray;
             }
             else
@@ -520,7 +521,7 @@ namespace Lucene.Net.Util
             if (array.Length < minSize)
             {
                 char[] newArray = new char[Oversize(minSize, RamUsageEstimator.NUM_BYTES_CHAR)];
-                Array.Copy(array, 0, newArray, 0, array.Length);
+                Arrays.Copy(array, 0, newArray, 0, array.Length);
                 return newArray;
             }
             else
@@ -542,7 +543,7 @@ namespace Lucene.Net.Util
             if (newSize != array.Length)
             {
                 char[] newArray = new char[newSize];
-                Array.Copy(array, 0, newArray, 0, newSize);
+                Arrays.Copy(array, 0, newArray, 0, newSize);
                 return newArray;
             }
             else
@@ -558,7 +559,7 @@ namespace Lucene.Net.Util
             if (array.Length < minSize)
             {
                 var newArray = new int[Oversize(minSize, RamUsageEstimator.NUM_BYTES_OBJECT_REF)][];
-                Array.Copy(array, 0, newArray, 0, array.Length);
+                Arrays.Copy(array, 0, newArray, 0, array.Length);
                 return newArray;
             }
             else
@@ -582,7 +583,7 @@ namespace Lucene.Net.Util
             if (newSize != array.Length)
             {
                 int[][] newArray = new int[newSize][];
-                Array.Copy(array, 0, newArray, 0, newSize);
+                Arrays.Copy(array, 0, newArray, 0, newSize);
                 return newArray;
             }
             else
@@ -598,7 +599,7 @@ namespace Lucene.Net.Util
             if (array.Length < minSize)
             {
                 float[][] newArray = new float[Oversize(minSize, RamUsageEstimator.NUM_BYTES_OBJECT_REF)][];
-                Array.Copy(array, 0, newArray, 0, array.Length);
+                Arrays.Copy(array, 0, newArray, 0, array.Length);
                 return newArray;
             }
             else
@@ -622,7 +623,7 @@ namespace Lucene.Net.Util
             if (newSize != array.Length)
             {
                 float[][] newArray = new float[newSize][];
-                Array.Copy(array, 0, newArray, 0, newSize);
+                Arrays.Copy(array, 0, newArray, 0, newSize);
                 return newArray;
             }
             else
diff --git a/src/Lucene.Net/Util/Automaton/Automaton.cs b/src/Lucene.Net/Util/Automaton/Automaton.cs
index bef22d5e5..e275c2807 100644
--- a/src/Lucene.Net/Util/Automaton/Automaton.cs
+++ b/src/Lucene.Net/Util/Automaton/Automaton.cs
@@ -1,6 +1,7 @@
 using J2N;
 using J2N.Collections.Generic.Extensions;
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 using System.Runtime.CompilerServices;
@@ -308,7 +309,7 @@ namespace Lucene.Net.Util.Automaton
             if (count < states.Length)
             {
                 State[] newArray = new State[count];
-                Array.Copy(states, 0, newArray, 0, count);
+                Arrays.Copy(states, 0, newArray, 0, count);
                 numberedStates = newArray;
             }
             else
diff --git a/src/Lucene.Net/Util/Automaton/SortedIntSet.cs b/src/Lucene.Net/Util/Automaton/SortedIntSet.cs
index 4ae1bf2ef..1ef92c6ce 100644
--- a/src/Lucene.Net/Util/Automaton/SortedIntSet.cs
+++ b/src/Lucene.Net/Util/Automaton/SortedIntSet.cs
@@ -1,4 +1,5 @@
-using Lucene.Net.Diagnostics;
+using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 using System.Runtime.CompilerServices;
@@ -196,7 +197,7 @@ namespace Lucene.Net.Util.Automaton
         public FrozenInt32Set ToFrozenInt32Set() // LUCENENET specific
         {
             int[] c = new int[upto];
-            Array.Copy(values, 0, c, 0, upto);
+            Arrays.Copy(values, 0, c, 0, upto);
             return new FrozenInt32Set(c, this.hashCode, this.state);
         }
 
@@ -204,7 +205,7 @@ namespace Lucene.Net.Util.Automaton
         public FrozenInt32Set Freeze(State state)
         {
             int[] c = new int[upto];
-            Array.Copy(values, 0, c, 0, upto);
+            Arrays.Copy(values, 0, c, 0, upto);
             return new FrozenInt32Set(c, hashCode, state);
         }
 
diff --git a/src/Lucene.Net/Util/Automaton/UTF32ToUTF8.cs b/src/Lucene.Net/Util/Automaton/UTF32ToUTF8.cs
index b11ab0e52..c5c8c84bf 100644
--- a/src/Lucene.Net/Util/Automaton/UTF32ToUTF8.cs
+++ b/src/Lucene.Net/Util/Automaton/UTF32ToUTF8.cs
@@ -1,5 +1,6 @@
 using J2N;
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 using System.Runtime.CompilerServices;
@@ -382,7 +383,7 @@ namespace Lucene.Net.Util.Automaton
             if (utf8StateCount == utf8States.Length)
             {
                 State[] newArray = new State[ArrayUtil.Oversize(1 + utf8StateCount, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                Array.Copy(utf8States, 0, newArray, 0, utf8StateCount);
+                Arrays.Copy(utf8States, 0, newArray, 0, utf8StateCount);
                 utf8States = newArray;
             }
             utf8States[utf8StateCount] = s;
diff --git a/src/Lucene.Net/Util/ByteBlockPool.cs b/src/Lucene.Net/Util/ByteBlockPool.cs
index 29ece09c1..e11c13406 100644
--- a/src/Lucene.Net/Util/ByteBlockPool.cs
+++ b/src/Lucene.Net/Util/ByteBlockPool.cs
@@ -257,7 +257,7 @@ namespace Lucene.Net.Util
             if (1 + bufferUpto == buffers.Length)
             {
                 var newBuffers = new byte[ArrayUtil.Oversize(buffers.Length + 1, RamUsageEstimator.NUM_BYTES_OBJECT_REF)][];
-                Array.Copy(buffers, 0, newBuffers, 0, buffers.Length);
+                Arrays.Copy(buffers, 0, newBuffers, 0, buffers.Length);
                 buffers = newBuffers;
             }
             buffer = buffers[1 + bufferUpto] = allocator.GetByteBlock();
@@ -380,7 +380,7 @@ namespace Lucene.Net.Util
             {
                 if (overflow <= 0)
                 {
-                    Array.Copy(bytes.Bytes, offset, buffer, ByteUpto, length);
+                    Arrays.Copy(bytes.Bytes, offset, buffer, ByteUpto, length);
                     ByteUpto += length;
                     break;
                 }
@@ -389,7 +389,7 @@ namespace Lucene.Net.Util
                     int bytesToCopy = length - overflow;
                     if (bytesToCopy > 0)
                     {
-                        Array.Copy(bytes.Bytes, offset, buffer, ByteUpto, bytesToCopy);
+                        Arrays.Copy(bytes.Bytes, offset, buffer, ByteUpto, bytesToCopy);
                         offset += bytesToCopy;
                         length -= bytesToCopy;
                     }
@@ -420,13 +420,13 @@ namespace Lucene.Net.Util
             {
                 if (overflow <= 0)
                 {
-                    Array.Copy(buffer, pos, bytes, bytesOffset, bytesLength);
+                    Arrays.Copy(buffer, pos, bytes, bytesOffset, bytesLength);
                     break;
                 }
                 else
                 {
                     int bytesToCopy = length - overflow;
-                    Array.Copy(buffer, pos, bytes, bytesOffset, bytesToCopy);
+                    Arrays.Copy(buffer, pos, bytes, bytesOffset, bytesToCopy);
                     pos = 0;
                     bytesLength -= bytesToCopy;
                     bytesOffset += bytesToCopy;
diff --git a/src/Lucene.Net/Util/BytesRef.cs b/src/Lucene.Net/Util/BytesRef.cs
index fd953bfc6..a6715b9ee 100644
--- a/src/Lucene.Net/Util/BytesRef.cs
+++ b/src/Lucene.Net/Util/BytesRef.cs
@@ -275,7 +275,7 @@ namespace Lucene.Net.Util
                 bytes = new byte[other.Length];
                 Offset = 0;
             }
-            Array.Copy(other.bytes, other.Offset, bytes, Offset, other.Length);
+            Arrays.Copy(other.bytes, other.Offset, bytes, Offset, other.Length);
             Length = other.Length;
         }
 
@@ -291,11 +291,11 @@ namespace Lucene.Net.Util
             if (bytes.Length - Offset < newLen)
             {
                 var newBytes = new byte[newLen];
-                Array.Copy(bytes, Offset, newBytes, 0, Length);
+                Arrays.Copy(bytes, Offset, newBytes, 0, Length);
                 Offset = 0;
                 bytes = newBytes;
             }
-            Array.Copy(other.bytes, other.Offset, bytes, Length + Offset, other.Length);
+            Arrays.Copy(other.bytes, other.Offset, bytes, Length + Offset, other.Length);
             Length = newLen;
         }
 
diff --git a/src/Lucene.Net/Util/BytesRefHash.cs b/src/Lucene.Net/Util/BytesRefHash.cs
index bd8eacef2..d8c2d07e4 100644
--- a/src/Lucene.Net/Util/BytesRefHash.cs
+++ b/src/Lucene.Net/Util/BytesRefHash.cs
@@ -349,7 +349,7 @@ namespace Lucene.Net.Util
                     buffer[bufferUpto] = (byte)length;
                     pool.ByteUpto += length + 1;
                     if (Debugging.AssertsEnabled) Debugging.Assert(length >= 0,"Length must be positive: {0}", length);
-                    System.Buffer.BlockCopy(bytes.Bytes, bytes.Offset, buffer, bufferUpto + 1, length);
+                    Arrays.Copy(bytes.Bytes, bytes.Offset, buffer, bufferUpto + 1, length);
                 }
                 else
                 {
@@ -357,7 +357,7 @@ namespace Lucene.Net.Util
                     buffer[bufferUpto] = (byte)(0x80 | (length & 0x7f));
                     buffer[bufferUpto + 1] = (byte)((length >> 7) & 0xff);
                     pool.ByteUpto += length + 2;
-                    System.Buffer.BlockCopy(bytes.Bytes, bytes.Offset, buffer, bufferUpto + 2, length);
+                    Arrays.Copy(bytes.Bytes, bytes.Offset, buffer, bufferUpto + 2, length);
                 }
                 if (Debugging.AssertsEnabled) Debugging.Assert(ids[hashPos] == -1);
                 ids[hashPos] = e;
diff --git a/src/Lucene.Net/Util/CharsRef.cs b/src/Lucene.Net/Util/CharsRef.cs
index 8de204cbd..b268e3d06 100644
--- a/src/Lucene.Net/Util/CharsRef.cs
+++ b/src/Lucene.Net/Util/CharsRef.cs
@@ -242,7 +242,7 @@ namespace Lucene.Net.Util
                 chars = new char[otherLength];
                 Offset = 0;
             }
-            Array.Copy(otherChars, otherOffset, chars, Offset, otherLength);
+            Arrays.Copy(otherChars, otherOffset, chars, Offset, otherLength);
             Length = otherLength;
         }
 
@@ -255,11 +255,11 @@ namespace Lucene.Net.Util
             if (chars.Length - Offset < newLen)
             {
                 var newChars = new char[newLen];
-                Array.Copy(chars, Offset, newChars, 0, Length);
+                Arrays.Copy(chars, Offset, newChars, 0, Length);
                 Offset = 0;
                 chars = newChars;
             }
-            Array.Copy(otherChars, otherOffset, chars, Length + Offset, otherLength);
+            Arrays.Copy(otherChars, otherOffset, chars, Length + Offset, otherLength);
             Length = newLen;
         }
 
diff --git a/src/Lucene.Net/Util/FixedBitSet.cs b/src/Lucene.Net/Util/FixedBitSet.cs
index 96f73448b..d564ee87d 100644
--- a/src/Lucene.Net/Util/FixedBitSet.cs
+++ b/src/Lucene.Net/Util/FixedBitSet.cs
@@ -698,7 +698,7 @@ namespace Lucene.Net.Util
         public FixedBitSet Clone()
         {
             long[] bits = new long[this.bits.Length];
-            Array.Copy(this.bits, 0, bits, 0, bits.Length);
+            Arrays.Copy(this.bits, 0, bits, 0, bits.Length);
             return new FixedBitSet(bits, numBits);
         }
 
diff --git a/src/Lucene.Net/Util/Fst/Builder.cs b/src/Lucene.Net/Util/Fst/Builder.cs
index 78f61bedb..9d8c1647f 100644
--- a/src/Lucene.Net/Util/Fst/Builder.cs
+++ b/src/Lucene.Net/Util/Fst/Builder.cs
@@ -412,7 +412,7 @@ namespace Lucene.Net.Util.Fst
             if (frontier.Length < input.Length + 1)
             {
                 UnCompiledNode<T>[] next = new UnCompiledNode<T>[ArrayUtil.Oversize(input.Length + 1, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                Array.Copy(frontier, 0, next, 0, frontier.Length);
+                Arrays.Copy(frontier, 0, next, 0, frontier.Length);
                 for (int idx = frontier.Length; idx < next.Length; idx++)
                 {
                     next[idx] = new UnCompiledNode<T>(this, idx);
@@ -682,7 +682,7 @@ namespace Lucene.Net.Util.Fst
                 if (NumArcs == Arcs.Length)
                 {
                     Arc<S>[] newArcs = new Arc<S>[ArrayUtil.Oversize(NumArcs + 1, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                    Array.Copy(Arcs, 0, newArcs, 0, Arcs.Length);
+                    Arrays.Copy(Arcs, 0, newArcs, 0, Arcs.Length);
                     for (int arcIdx = NumArcs; arcIdx < newArcs.Length; arcIdx++)
                     {
                         newArcs[arcIdx] = new Arc<S>();
diff --git a/src/Lucene.Net/Util/Fst/ByteSequenceOutputs.cs b/src/Lucene.Net/Util/Fst/ByteSequenceOutputs.cs
index 57f147945..364ef99de 100644
--- a/src/Lucene.Net/Util/Fst/ByteSequenceOutputs.cs
+++ b/src/Lucene.Net/Util/Fst/ByteSequenceOutputs.cs
@@ -1,4 +1,5 @@
-using Lucene.Net.Diagnostics;
+using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Runtime.CompilerServices;
 
@@ -131,8 +132,8 @@ namespace Lucene.Net.Util.Fst
                 if (Debugging.AssertsEnabled) Debugging.Assert(prefix.Length > 0);
                 if (Debugging.AssertsEnabled) Debugging.Assert(output.Length > 0);
                 BytesRef result = new BytesRef(prefix.Length + output.Length);
-                Array.Copy(prefix.Bytes, prefix.Offset, result.Bytes, 0, prefix.Length);
-                Array.Copy(output.Bytes, output.Offset, result.Bytes, prefix.Length, output.Length);
+                Arrays.Copy(prefix.Bytes, prefix.Offset, result.Bytes, 0, prefix.Length);
+                Arrays.Copy(output.Bytes, output.Offset, result.Bytes, prefix.Length, output.Length);
                 result.Length = prefix.Length + output.Length;
                 return result;
             }
diff --git a/src/Lucene.Net/Util/Fst/BytesStore.cs b/src/Lucene.Net/Util/Fst/BytesStore.cs
index 6d4fa43ce..1ea9f88f7 100644
--- a/src/Lucene.Net/Util/Fst/BytesStore.cs
+++ b/src/Lucene.Net/Util/Fst/BytesStore.cs
@@ -1,4 +1,5 @@
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Runtime.CompilerServices;
 using JCG = J2N.Collections.Generic;
@@ -103,7 +104,7 @@ namespace Lucene.Net.Util.Fst
                 int chunk = blockSize - nextWrite;
                 if (len <= chunk)
                 {
-                    System.Buffer.BlockCopy(b, offset, current, nextWrite, len);
+                    Arrays.Copy(b, offset, current, nextWrite, len);
                     nextWrite += len;
                     break;
                 }
@@ -111,7 +112,7 @@ namespace Lucene.Net.Util.Fst
                 {
                     if (chunk > 0)
                     {
-                        Array.Copy(b, offset, current, nextWrite, chunk);
+                        Arrays.Copy(b, offset, current, nextWrite, chunk);
                         offset += chunk;
                         len -= chunk;
                     }
@@ -176,14 +177,14 @@ namespace Lucene.Net.Util.Fst
                 if (len <= downTo)
                 {
                     //System.out.println("      final: offset=" + offset + " len=" + len + " dest=" + (downTo-len));
-                    Array.Copy(b, offset, block, downTo - len, len);
+                    Arrays.Copy(b, offset, block, downTo - len, len);
                     break;
                 }
                 else
                 {
                     len -= downTo;
                     //System.out.println("      partial: offset=" + (offset + len) + " len=" + downTo + " dest=0");
-                    Array.Copy(b, offset + len, block, 0, downTo);
+                    Arrays.Copy(b, offset + len, block, 0, downTo);
                     blockIndex--;
                     block = blocks[blockIndex];
                     downTo = blockSize;
@@ -388,7 +389,7 @@ namespace Lucene.Net.Util.Fst
             if (current != null)
             {
                 byte[] lastBuffer = new byte[nextWrite];
-                Array.Copy(current, 0, lastBuffer, 0, nextWrite);
+                Arrays.Copy(current, 0, lastBuffer, 0, nextWrite);
                 blocks[blocks.Count - 1] = lastBuffer;
                 current = null;
             }
@@ -451,7 +452,7 @@ namespace Lucene.Net.Util.Fst
                     int chunkLeft = outerInstance.blockSize - nextRead;
                     if (len <= chunkLeft)
                     {
-                        Array.Copy(current, nextRead, b, offset, len);
+                        Arrays.Copy(current, nextRead, b, offset, len);
                         nextRead += len;
                         break;
                     }
@@ -459,7 +460,7 @@ namespace Lucene.Net.Util.Fst
                     {
                         if (chunkLeft > 0)
                         {
-                            Array.Copy(current, nextRead, b, offset, chunkLeft);
+                            Arrays.Copy(current, nextRead, b, offset, chunkLeft);
                             offset += chunkLeft;
                             len -= chunkLeft;
                         }
diff --git a/src/Lucene.Net/Util/Fst/CharSequenceOutputs.cs b/src/Lucene.Net/Util/Fst/CharSequenceOutputs.cs
index 4c5cdb91c..e68d4e340 100644
--- a/src/Lucene.Net/Util/Fst/CharSequenceOutputs.cs
+++ b/src/Lucene.Net/Util/Fst/CharSequenceOutputs.cs
@@ -1,4 +1,5 @@
-using Lucene.Net.Diagnostics;
+using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Runtime.CompilerServices;
 
@@ -134,8 +135,8 @@ namespace Lucene.Net.Util.Fst
                     Debugging.Assert(output.Length > 0);
                 }
                 var result = new CharsRef(prefix.Length + output.Length);
-                Array.Copy(prefix.Chars, prefix.Offset, result.Chars, 0, prefix.Length);
-                Array.Copy(output.Chars, output.Offset, result.Chars, prefix.Length, output.Length);
+                Arrays.Copy(prefix.Chars, prefix.Offset, result.Chars, 0, prefix.Length);
+                Arrays.Copy(output.Chars, output.Offset, result.Chars, prefix.Length, output.Length);
                 result.Length = prefix.Length + output.Length;
                 return result;
             }
diff --git a/src/Lucene.Net/Util/Fst/FSTEnum.cs b/src/Lucene.Net/Util/Fst/FSTEnum.cs
index 9d5f7901c..8c88fa305 100644
--- a/src/Lucene.Net/Util/Fst/FSTEnum.cs
+++ b/src/Lucene.Net/Util/Fst/FSTEnum.cs
@@ -1,5 +1,6 @@
 using J2N.Numerics;
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Runtime.CompilerServices;
 
@@ -568,13 +569,13 @@ namespace Lucene.Net.Util.Fst
             if (m_arcs.Length <= m_upto)
             {
                 FST.Arc<T>[] newArcs = new FST.Arc<T>[ArrayUtil.Oversize(1 + m_upto, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                Array.Copy(m_arcs, 0, newArcs, 0, m_arcs.Length);
+                Arrays.Copy(m_arcs, 0, newArcs, 0, m_arcs.Length);
                 m_arcs = newArcs;
             }
             if (m_output.Length <= m_upto)
             {
                 T[] newOutput = new T[ArrayUtil.Oversize(1 + m_upto, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                Array.Copy(m_output, 0, newOutput, 0, m_output.Length);
+                Arrays.Copy(m_output, 0, newOutput, 0, m_output.Length);
                 m_output = newOutput;
             }
         }
diff --git a/src/Lucene.Net/Util/Fst/ForwardBytesReader.cs b/src/Lucene.Net/Util/Fst/ForwardBytesReader.cs
index a10c9135f..809f64117 100644
--- a/src/Lucene.Net/Util/Fst/ForwardBytesReader.cs
+++ b/src/Lucene.Net/Util/Fst/ForwardBytesReader.cs
@@ -1,3 +1,4 @@
+using Lucene.Net.Support;
 using System;
 using System.Runtime.CompilerServices;
 
@@ -44,7 +45,7 @@ namespace Lucene.Net.Util.Fst
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public override void ReadBytes(byte[] b, int offset, int len)
         {
-            Array.Copy(bytes, pos, b, offset, len);
+            Arrays.Copy(bytes, pos, b, offset, len);
             pos += len;
         }
 
diff --git a/src/Lucene.Net/Util/Fst/IntSequenceOutputs.cs b/src/Lucene.Net/Util/Fst/IntSequenceOutputs.cs
index 90d4d84a0..3fabbaa7e 100644
--- a/src/Lucene.Net/Util/Fst/IntSequenceOutputs.cs
+++ b/src/Lucene.Net/Util/Fst/IntSequenceOutputs.cs
@@ -1,4 +1,5 @@
-using Lucene.Net.Diagnostics;
+using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Runtime.CompilerServices;
 
@@ -136,8 +137,8 @@ namespace Lucene.Net.Util.Fst
                     Debugging.Assert(output.Length > 0);
                 }
                 Int32sRef result = new Int32sRef(prefix.Length + output.Length);
-                Array.Copy(prefix.Int32s, prefix.Offset, result.Int32s, 0, prefix.Length);
-                Array.Copy(output.Int32s, output.Offset, result.Int32s, prefix.Length, output.Length);
+                Arrays.Copy(prefix.Int32s, prefix.Offset, result.Int32s, 0, prefix.Length);
+                Arrays.Copy(output.Int32s, output.Offset, result.Int32s, prefix.Length, output.Length);
                 result.Length = prefix.Length + output.Length;
                 return result;
             }
diff --git a/src/Lucene.Net/Util/Fst/Util.cs b/src/Lucene.Net/Util/Fst/Util.cs
index 0267da5fd..313e0d142 100644
--- a/src/Lucene.Net/Util/Fst/Util.cs
+++ b/src/Lucene.Net/Util/Fst/Util.cs
@@ -2,6 +2,7 @@
 using J2N.Numerics;
 using J2N.Text;
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using Lucene.Net.Support.Threading;
 using System;
 using System.Collections.Generic;
@@ -428,7 +429,7 @@ namespace Lucene.Net.Util.Fst
                 // copy over the current input to the new input
                 // and add the arc.label to the end
                 Int32sRef newInput = new Int32sRef(path.Input.Length + 1);
-                Array.Copy(path.Input.Int32s, 0, newInput.Int32s, 0, path.Input.Length);
+                Arrays.Copy(path.Input.Int32s, 0, newInput.Int32s, 0, path.Input.Length);
                 newInput.Int32s[path.Input.Length] = path.Arc.Label;
                 newInput.Length = path.Input.Length + 1;
                 FSTPath<T> newPath = new FSTPath<T>(cost, path.Arc, newInput);
diff --git a/src/Lucene.Net/Util/GrowableByteArrayDataOutput.cs b/src/Lucene.Net/Util/GrowableByteArrayDataOutput.cs
index 20a398170..74d0aa5da 100644
--- a/src/Lucene.Net/Util/GrowableByteArrayDataOutput.cs
+++ b/src/Lucene.Net/Util/GrowableByteArrayDataOutput.cs
@@ -1,4 +1,4 @@
-using Lucene.Net.Support;
+using Lucene.Net.Support;
 using System.Diagnostics.CodeAnalysis;
 using System.Runtime.CompilerServices;
 
@@ -68,7 +68,7 @@ namespace Lucene.Net.Util
         {
             int newLength = Length + len;
             bytes = ArrayUtil.Grow(bytes, newLength);
-            System.Buffer.BlockCopy(b, off, bytes, Length, len);
+            Arrays.Copy(b, off, bytes, Length, len);
             Length = newLength;
         }
     }
diff --git a/src/Lucene.Net/Util/IntBlockPool.cs b/src/Lucene.Net/Util/IntBlockPool.cs
index 36574628e..9410f444c 100644
--- a/src/Lucene.Net/Util/IntBlockPool.cs
+++ b/src/Lucene.Net/Util/IntBlockPool.cs
@@ -228,7 +228,7 @@ namespace Lucene.Net.Util
             if (1 + bufferUpto == buffers.Length)
             {
                 int[][] newBuffers = new int[(int)(buffers.Length * 1.5)][];
-                Array.Copy(buffers, 0, newBuffers, 0, buffers.Length);
+                Arrays.Copy(buffers, 0, newBuffers, 0, buffers.Length);
                 buffers = newBuffers;
             }
             buffer = buffers[1 + bufferUpto] = allocator.GetInt32Block();
diff --git a/src/Lucene.Net/Util/IntsRef.cs b/src/Lucene.Net/Util/IntsRef.cs
index 56a4ba732..6603ac473 100644
--- a/src/Lucene.Net/Util/IntsRef.cs
+++ b/src/Lucene.Net/Util/IntsRef.cs
@@ -204,7 +204,7 @@ namespace Lucene.Net.Util
                 ints = new int[other.Length];
                 Offset = 0;
             }
-            Array.Copy(other.ints, other.Offset, ints, Offset, other.Length);
+            Arrays.Copy(other.ints, other.Offset, ints, Offset, other.Length);
             Length = other.Length;
         }
 
diff --git a/src/Lucene.Net/Util/LongBitSet.cs b/src/Lucene.Net/Util/LongBitSet.cs
index 491ff84ec..66ddf8ac7 100644
--- a/src/Lucene.Net/Util/LongBitSet.cs
+++ b/src/Lucene.Net/Util/LongBitSet.cs
@@ -426,7 +426,7 @@ namespace Lucene.Net.Util
         public Int64BitSet Clone()
         {
             long[] bits = new long[this.bits.Length];
-            Array.Copy(this.bits, 0, bits, 0, bits.Length);
+            Arrays.Copy(this.bits, 0, bits, 0, bits.Length);
             return new Int64BitSet(bits, numBits);
         }
 
diff --git a/src/Lucene.Net/Util/LongsRef.cs b/src/Lucene.Net/Util/LongsRef.cs
index f79760645..66404ef62 100644
--- a/src/Lucene.Net/Util/LongsRef.cs
+++ b/src/Lucene.Net/Util/LongsRef.cs
@@ -205,7 +205,7 @@ namespace Lucene.Net.Util
                 longs = new long[other.Length];
                 Offset = 0;
             }
-            Array.Copy(other.longs, other.Offset, longs, Offset, other.Length);
+            Arrays.Copy(other.longs, other.Offset, longs, Offset, other.Length);
             Length = other.Length;
         }
 
diff --git a/src/Lucene.Net/Util/OpenBitSet.cs b/src/Lucene.Net/Util/OpenBitSet.cs
index 884633b19..cda676133 100644
--- a/src/Lucene.Net/Util/OpenBitSet.cs
+++ b/src/Lucene.Net/Util/OpenBitSet.cs
@@ -929,7 +929,7 @@ namespace Lucene.Net.Util
             }
             if (oldLen < newLen)
             {
-                Array.Copy(otherArr, oldLen, thisArr, oldLen, newLen - oldLen);
+                Arrays.Copy(otherArr, oldLen, thisArr, oldLen, newLen - oldLen);
             }
         }
 
@@ -969,7 +969,7 @@ namespace Lucene.Net.Util
             }
             if (oldLen < newLen)
             {
-                Array.Copy(otherArr, oldLen, thisArr, oldLen, newLen - oldLen);
+                Arrays.Copy(otherArr, oldLen, thisArr, oldLen, newLen - oldLen);
             }
         }
 
diff --git a/src/Lucene.Net/Util/Packed/AppendingDeltaPackedLongBuffer.cs b/src/Lucene.Net/Util/Packed/AppendingDeltaPackedLongBuffer.cs
index 7b3fb7ac9..cd2e5185c 100644
--- a/src/Lucene.Net/Util/Packed/AppendingDeltaPackedLongBuffer.cs
+++ b/src/Lucene.Net/Util/Packed/AppendingDeltaPackedLongBuffer.cs
@@ -84,7 +84,7 @@ namespace Lucene.Net.Util.Packed
             if (block == valuesOff)
             {
                 int sysCopyToRead = Math.Min(len, pendingOff - element);
-                Array.Copy(pending, element, arr, off, sysCopyToRead);
+                Arrays.Copy(pending, element, arr, off, sysCopyToRead);
                 return sysCopyToRead;
             }
             else
diff --git a/src/Lucene.Net/Util/Packed/AppendingPackedLongBuffer.cs b/src/Lucene.Net/Util/Packed/AppendingPackedLongBuffer.cs
index 6652d1573..6d4ebde3d 100644
--- a/src/Lucene.Net/Util/Packed/AppendingPackedLongBuffer.cs
+++ b/src/Lucene.Net/Util/Packed/AppendingPackedLongBuffer.cs
@@ -1,3 +1,4 @@
+using Lucene.Net.Support;
 using System;
 
 namespace Lucene.Net.Util.Packed
@@ -74,7 +75,7 @@ namespace Lucene.Net.Util.Packed
             if (block == valuesOff)
             {
                 int sysCopyToRead = Math.Min(len, pendingOff - element);
-                Array.Copy(pending, element, arr, off, sysCopyToRead);
+                Arrays.Copy(pending, element, arr, off, sysCopyToRead);
                 return sysCopyToRead;
             }
             else
diff --git a/src/Lucene.Net/Util/Packed/Direct64.cs b/src/Lucene.Net/Util/Packed/Direct64.cs
index c32b08b63..21ab51a81 100644
--- a/src/Lucene.Net/Util/Packed/Direct64.cs
+++ b/src/Lucene.Net/Util/Packed/Direct64.cs
@@ -1,4 +1,4 @@
-using Lucene.Net.Diagnostics;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Support;
 using System;
 using System.Runtime.CompilerServices;
@@ -95,7 +95,7 @@ namespace Lucene.Net.Util.Packed
             }
 
             int gets = Math.Min(m_valueCount - index, len);
-            System.Array.Copy(values, index, arr, off, gets);
+            Arrays.Copy(values, index, arr, off, gets);
             return gets;
         }
 
@@ -109,7 +109,7 @@ namespace Lucene.Net.Util.Packed
             }
 
             int sets = Math.Min(m_valueCount - index, len);
-            System.Array.Copy(arr, off, values, index, sets);
+            Arrays.Copy(arr, off, values, index, sets);
             return sets;
         }
 
diff --git a/src/Lucene.Net/Util/Packed/MonotonicAppendingLongBuffer.cs b/src/Lucene.Net/Util/Packed/MonotonicAppendingLongBuffer.cs
index 2bf660cdf..b03bdcbec 100644
--- a/src/Lucene.Net/Util/Packed/MonotonicAppendingLongBuffer.cs
+++ b/src/Lucene.Net/Util/Packed/MonotonicAppendingLongBuffer.cs
@@ -103,7 +103,7 @@ namespace Lucene.Net.Util.Packed
             if (block == valuesOff)
             {
                 int sysCopyToRead = Math.Min(len, pendingOff - element);
-                Array.Copy(pending, element, arr, off, sysCopyToRead);
+                Arrays.Copy(pending, element, arr, off, sysCopyToRead);
                 return sysCopyToRead;
             }
             else
diff --git a/src/Lucene.Net/Util/Packed/PackedInts.cs b/src/Lucene.Net/Util/Packed/PackedInts.cs
index 40f74f06f..2afe78b14 100644
--- a/src/Lucene.Net/Util/Packed/PackedInts.cs
+++ b/src/Lucene.Net/Util/Packed/PackedInts.cs
@@ -1421,7 +1421,7 @@ namespace Lucene.Net.Util.Packed
                 destPos += written;
                 if (written < remaining)
                 {
-                    Array.Copy(buf, written, buf, 0, remaining - written);
+                    Arrays.Copy(buf, written, buf, 0, remaining - written);
                 }
                 remaining -= written;
             }
@@ -1430,7 +1430,7 @@ namespace Lucene.Net.Util.Packed
                 int written = dest.Set(destPos, buf, 0, remaining);
                 destPos += written;
                 remaining -= written;
-                Array.Copy(buf, written, buf, 0, remaining);
+                Arrays.Copy(buf, written, buf, 0, remaining);
             }
         }
 
diff --git a/src/Lucene.Net/Util/PagedBytes.cs b/src/Lucene.Net/Util/PagedBytes.cs
index 5d1ec1339..0a1bd9c19 100644
--- a/src/Lucene.Net/Util/PagedBytes.cs
+++ b/src/Lucene.Net/Util/PagedBytes.cs
@@ -120,8 +120,8 @@ namespace Lucene.Net.Util
                     // Split
                     b.Bytes = new byte[length];
                     b.Offset = 0;
-                    Array.Copy(blocks[index], offset, b.Bytes, 0, blockSize - offset);
-                    Array.Copy(blocks[1 + index], 0, b.Bytes, blockSize - offset, length - (blockSize - offset));
+                    Arrays.Copy(blocks[index], offset, b.Bytes, 0, blockSize - offset);
+                    Arrays.Copy(blocks[1 + index], 0, b.Bytes, blockSize - offset, length - (blockSize - offset));
                 }
             }
 
@@ -235,7 +235,7 @@ namespace Lucene.Net.Util
             @out.Offset = upto;
             @out.Length = bytes.Length;
 
-            Array.Copy(bytes.Bytes, bytes.Offset, currentBlock, upto, bytes.Length);
+            Arrays.Copy(bytes.Bytes, bytes.Offset, currentBlock, upto, bytes.Length);
             upto += bytes.Length;
         }
 
@@ -254,7 +254,7 @@ namespace Lucene.Net.Util
             if (trim && upto < blockSize)
             {
                 var newBlock = new byte[upto];
-                Array.Copy(currentBlock, 0, newBlock, 0, upto);
+                Arrays.Copy(currentBlock, 0, newBlock, 0, upto);
                 currentBlock = newBlock;
             }
             if (currentBlock is null)
@@ -330,7 +330,7 @@ namespace Lucene.Net.Util
                 currentBlock[upto++] = unchecked((byte)(0x80 | (bytes.Length >> 8)));
                 currentBlock[upto++] = unchecked((byte)(bytes.Length & 0xff));
             }
-            Array.Copy(bytes.Bytes, bytes.Offset, currentBlock, upto, bytes.Length);
+            Arrays.Copy(bytes.Bytes, bytes.Offset, currentBlock, upto, bytes.Length);
             upto += bytes.Length;
 
             return pointer;
@@ -395,14 +395,14 @@ namespace Lucene.Net.Util
                     int left = offsetEnd - offset;
                     if (blockLeft < left)
                     {
-                        System.Buffer.BlockCopy(currentBlock, currentBlockUpto, b, offset, blockLeft);
+                        Arrays.Copy(currentBlock, currentBlockUpto, b, offset, blockLeft);
                         NextBlock();
                         offset += blockLeft;
                     }
                     else
                     {
                         // Last block
-                        System.Buffer.BlockCopy(currentBlock, currentBlockUpto, b, offset, left);
+                        Arrays.Copy(currentBlock, currentBlockUpto, b, offset, left);
                         currentBlockUpto += left;
                         break;
                     }
@@ -468,7 +468,7 @@ namespace Lucene.Net.Util
                     int blockLeft = outerInstance.blockSize - outerInstance.upto;
                     if (blockLeft < left)
                     {
-                        System.Buffer.BlockCopy(b, offset, outerInstance.currentBlock, outerInstance.upto, blockLeft);
+                        Arrays.Copy(b, offset, outerInstance.currentBlock, outerInstance.upto, blockLeft);
                         outerInstance.blocks.Add(outerInstance.currentBlock);
                         outerInstance.blockEnd.Add(outerInstance.blockSize);
                         outerInstance.currentBlock = new byte[outerInstance.blockSize];
@@ -478,7 +478,7 @@ namespace Lucene.Net.Util
                     else
                     {
                         // Last block
-                        System.Buffer.BlockCopy(b, offset, outerInstance.currentBlock, outerInstance.upto, left);
+                        Arrays.Copy(b, offset, outerInstance.currentBlock, outerInstance.upto, left);
                         outerInstance.upto += left;
                         break;
                     }
diff --git a/src/Lucene.Net/Util/RecyclingByteBlockAllocator.cs b/src/Lucene.Net/Util/RecyclingByteBlockAllocator.cs
index 21b855499..a7ee7411e 100644
--- a/src/Lucene.Net/Util/RecyclingByteBlockAllocator.cs
+++ b/src/Lucene.Net/Util/RecyclingByteBlockAllocator.cs
@@ -1,4 +1,5 @@
-using Lucene.Net.Diagnostics;
+using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 
 namespace Lucene.Net.Util
@@ -95,7 +96,7 @@ namespace Lucene.Net.Util
             if (size >= freeByteBlocks.Length)
             {
                 var newBlocks = new byte[ArrayUtil.Oversize(size, RamUsageEstimator.NUM_BYTES_OBJECT_REF)][];
-                Array.Copy(freeByteBlocks, 0, newBlocks, 0, freeBlocks);
+                Arrays.Copy(freeByteBlocks, 0, newBlocks, 0, freeBlocks);
                 freeByteBlocks = newBlocks;
             }
             int stop = start + numBlocks;
diff --git a/src/Lucene.Net/Util/RecyclingIntBlockAllocator.cs b/src/Lucene.Net/Util/RecyclingIntBlockAllocator.cs
index 6487d5eff..a0b2e7d76 100644
--- a/src/Lucene.Net/Util/RecyclingIntBlockAllocator.cs
+++ b/src/Lucene.Net/Util/RecyclingIntBlockAllocator.cs
@@ -1,4 +1,5 @@
-using Lucene.Net.Diagnostics;
+using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 
 namespace Lucene.Net.Util
@@ -106,7 +107,7 @@ namespace Lucene.Net.Util
             if (size >= freeByteBlocks.Length)
             {
                 int[][] newBlocks = new int[ArrayUtil.Oversize(size, RamUsageEstimator.NUM_BYTES_OBJECT_REF)][];
-                Array.Copy(freeByteBlocks, 0, newBlocks, 0, freeBlocks);
+                Arrays.Copy(freeByteBlocks, 0, newBlocks, 0, freeBlocks);
                 freeByteBlocks = newBlocks;
             }
             int stop = start + numBlocks;
diff --git a/src/Lucene.Net/Util/RollingBuffer.cs b/src/Lucene.Net/Util/RollingBuffer.cs
index 84539c2ae..48139bd32 100644
--- a/src/Lucene.Net/Util/RollingBuffer.cs
+++ b/src/Lucene.Net/Util/RollingBuffer.cs
@@ -1,4 +1,5 @@
-using Lucene.Net.Diagnostics;
+using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Runtime.CompilerServices;
 
@@ -122,8 +123,8 @@ namespace Lucene.Net.Util
                 if (count == buffer.Length)
                 {
                     var newBuffer = new T[ArrayUtil.Oversize(1 + count, RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
-                    Array.Copy(buffer, nextWrite, newBuffer, 0, buffer.Length - nextWrite);
-                    Array.Copy(buffer, 0, newBuffer, buffer.Length - nextWrite, nextWrite);
+                    Arrays.Copy(buffer, nextWrite, newBuffer, 0, buffer.Length - nextWrite);
+                    Arrays.Copy(buffer, 0, newBuffer, buffer.Length - nextWrite, nextWrite);
                     for (int i = buffer.Length; i < newBuffer.Length; i++)
                     {
                         newBuffer[i] = NewInstance();
diff --git a/src/Lucene.Net/Util/UnicodeUtil.cs b/src/Lucene.Net/Util/UnicodeUtil.cs
index b6a6b8d30..f29ce7cbb 100644
--- a/src/Lucene.Net/Util/UnicodeUtil.cs
+++ b/src/Lucene.Net/Util/UnicodeUtil.cs
@@ -1,6 +1,7 @@
 using J2N;
 using J2N.Text;
 using Lucene.Net.Diagnostics;
+using Lucene.Net.Support;
 using System;
 using System.Runtime.CompilerServices;
 using System.Text;
@@ -902,7 +903,7 @@ namespace Lucene.Net.Util
             }
 
             var result = new char[w];
-            Array.Copy(chars, result, w);
+            Arrays.Copy(chars, result, w);
             return result;
         }