diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@
   , replies  :: Int
 } deriving (Show)
 -- Generate instances and category', user' etc. variables for queries/updates
-mkTableDefs "migrate" (tableConfig (''Test, WithRange) [] [])
+mkTableDefs "migrate" (tableConfig "" (''Test, WithRange) [] [])
 
 test :: IO ()
 test = do
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,7 @@
+# 0.4.0.0
+- Slightly changed TH API to allow table prefixing
+- Better consistency settings detection for queryOverIndex
+
 # 0.3.0.0
 - API changes regarding position of `Proxy`
 - Added index->table conversion functions
diff --git a/dynamodb-simple.cabal b/dynamodb-simple.cabal
--- a/dynamodb-simple.cabal
+++ b/dynamodb-simple.cabal
@@ -1,5 +1,5 @@
 name:                dynamodb-simple
-version:             0.3.0.0
+version:             0.4.0.0
 synopsis:            Typesafe library for working with DynamoDB database
 description:         Framework for accessing DynamoDB database. The majority of AWS API
                      is available to the user in a convenient, simple and typesafe manner.
diff --git a/src/Database/DynamoDB.hs b/src/Database/DynamoDB.hs
--- a/src/Database/DynamoDB.hs
+++ b/src/Database/DynamoDB.hs
@@ -260,7 +260,7 @@
 --   , messageid :: T.Text
 --   , subject :: T.Text
 -- } deriving (Show)
--- mkTableDefs "migrate" (tableConfig (''Test, WithRange) [] [])
+-- mkTableDefs "migrate" (tableConfig "" (''Test, WithRange) [] [])
 -- @
 --
 -- This code creates appropriate instances for the table and the columns. It creates
@@ -315,7 +315,7 @@
 --     i_category :: T.Text
 --   , i_messageid :: T.Text
 -- }
--- mkTableDefs "migrate" (tableConfig (''Test, WithRange) [(''TestIndex, NoRange)] [])
+-- mkTableDefs "migrate" (tableConfig "" (''Test, WithRange) [(''TestIndex, NoRange)] [])
 --
 -- doWithTest :: Test -> ...
 -- doWithTest item = (item ^. category) ...
diff --git a/src/Database/DynamoDB/Class.hs b/src/Database/DynamoDB/Class.hs
--- a/src/Database/DynamoDB/Class.hs
+++ b/src/Database/DynamoDB/Class.hs
@@ -182,6 +182,7 @@
 -- | Class representing a Global Secondary Index
 class DynamoCollection a r 'IsIndex => DynamoIndex a parent (r :: RangeType) | a -> parent r where
   indexName :: Proxy a -> T.Text
+  indexIsLocal :: Proxy a -> Bool
 
 class DynamoIndex a parent r => IndexCreate a parent (r :: RangeType) where
   createGlobalIndex ::
diff --git a/src/Database/DynamoDB/QueryRequest.hs b/src/Database/DynamoDB/QueryRequest.hs
--- a/src/Database/DynamoDB/QueryRequest.hs
+++ b/src/Database/DynamoDB/QueryRequest.hs
@@ -161,6 +161,10 @@
 
 -- | Query an index, fetch primary key from the result and immediately read
 -- full items from the main table.
+--
+-- You cannot perform strongly consistent reads on Global indexes; if you set
+-- the 'qConsistentRead' to 'Strongly', fetch from global indexes is still done
+-- as eventually consistent. Queries on local indexes are performed according to the settings.
 queryOverIndex :: forall a t m v1 v2 hash r2 range rest parent.
     (CanQuery a t hash range, MonadAWS m,
      Code a ~ '[ hash ': range ': rest],
@@ -169,12 +173,13 @@
      DynamoScalar v1 hash, DynamoScalar v2 range)
   => Proxy a -> QueryOpts a hash range -> Source m parent
 queryOverIndex p q =
-   querySourceChunks p q =$= CL.mapFoldableM batchParent
+   querySourceChunks p (q & setConsistency)
+      =$= CL.mapFoldableM batchParent
   where
-    batchParent vals = do
-      let keys = map dTableKey vals
-      -- TODO: it would be nice if we could paginate requests from getItemBatch downstraem
-      getItemBatch (q ^. qConsistentRead) keys
+    setConsistency -- Strong consistent reads not supported on global indexes
+      | indexIsLocal p = id
+      | otherwise = qConsistentRead .~ Eventually
+    batchParent vals = getItemBatch (q ^. qConsistentRead) (map dTableKey vals)
 
 -- | Perform a simple, eventually consistent, query.
 --
diff --git a/src/Database/DynamoDB/TH.hs b/src/Database/DynamoDB/TH.hs
--- a/src/Database/DynamoDB/TH.hs
+++ b/src/Database/DynamoDB/TH.hs
@@ -64,15 +64,16 @@
 
 -- | Simple table configuration
 tableConfig ::
-     (Name, RangeType)   -- ^ Table type name, primary key type
+     String -- ^ Prefix for table and index names; dynamodb doesn't have namespaces, this is to remedy the problem.
+  -> (Name, RangeType)   -- ^ Table type name, primary key type
   -> [(Name, RangeType)] -- ^ Global secondary index records, index key type
   -> [Name] -- ^ Local secondary index records
   -> TableConfig
-tableConfig (table, tbltype) globidx locidx =
+tableConfig prefix (table, tbltype) globidx locidx =
     TableConfig {
-        tableSetup = (table, tbltype, nameToStr table)
-      , globalIndexes = map (\(n,r) -> (n, r, nameToStr n)) globidx
-      , localIndexes = map (\n -> (n, nameToStr n)) locidx
+        tableSetup = (table, tbltype, prefix ++ nameToStr table)
+      , globalIndexes = map (\(n,r) -> (n, r, prefix ++ nameToStr n)) globidx
+      , localIndexes = map (\n -> (n, prefix ++ nameToStr n)) locidx
       , translateField = defaultTranslate
       , buildLens = True
     }
@@ -95,7 +96,7 @@
 -- > data Test { _first :: Text, _second :: Text, _third :: Int }
 -- > data TestIndex { u_third :: Int, i_second :: T.Text}
 -- >
--- > mkTableDefs (tableConfig (''Test, WithRange) [(''TestIndex, NoRange)] [])
+-- > mkTableDefs (tableConfig "" (''Test, WithRange) [(''TestIndex, NoRange)] [])
 -- >
 -- > deriveGenericOnly ''Test
 -- > instance DynamoCollection Test WithRange IsTable
@@ -131,7 +132,7 @@
 
     tblFieldNames <- getFieldNames table translateField
     buildColData tblFieldNames
-    genBaseCollection table tblrange tblname Nothing translateField
+    genBaseCollection table tblrange tblname Nothing translateField False
 
     -- Check, that hash key name in locindexes == hash key in primary table
     let tblHashName = fst (head tblFieldNames)
@@ -142,9 +143,10 @@
                   <> " is not equal to table hash key " <> show tblHashName)
 
     -- Instances for indices
-    let allindexes = globalIndexes ++ map (\(idx,name) -> (idx, WithRange, name)) localIndexes
-    forM_ allindexes $ \(idx, idxrange, idxname) -> do
-        genBaseCollection idx idxrange idxname (Just table) translateField
+    let allindexes = map (\(idx, idxrange, idxname) -> (idx, idxrange, idxname, False)) globalIndexes
+                    ++ map (\(idx,name) -> (idx, WithRange, name, True)) localIndexes
+    forM_ allindexes $ \(idx, idxrange, idxname, islocal) -> do
+        genBaseCollection idx idxrange idxname (Just table) translateField islocal
         -- Check that all records from indices conform to main table and create instances
         instfields <- getFieldNames idx translateField
         let pkeytable = [True | _ <- [1..(pkeySize idxrange)] ] ++ repeat False
@@ -180,8 +182,8 @@
 pkeySize NoRange = 1
 
 -- | Generate basic collection instances
-genBaseCollection :: Name -> RangeType -> String -> Maybe Name -> (String -> String) -> WriterT [Dec] Q ()
-genBaseCollection coll collrange tblname mparent translate = do
+genBaseCollection :: Name -> RangeType -> String -> Maybe Name -> (String -> String) -> Bool -> WriterT [Dec] Q ()
+genBaseCollection coll collrange tblname mparent translate isLocal = do
     tblFieldNames <- getFieldNames coll translate
     let fieldNames = map fst tblFieldNames
     let fieldList = listE (map (appE (varE 'T.pack) . litE . StringL) fieldNames)
@@ -210,6 +212,7 @@
         lift [d|
             instance DynamoIndex $(conT coll) $(conT parent) $(conT $ mrange collrange) where
                 indexName _ = $(appE (varE 'T.pack) (litE (StringL tblname)))
+                indexIsLocal _ = $(conE (if isLocal then 'True  else 'False))
               |] >>= tell
 
     -- Skip primary key, we cannot filter by it
diff --git a/test/BaseSpec.hs b/test/BaseSpec.hs
--- a/test/BaseSpec.hs
+++ b/test/BaseSpec.hs
@@ -42,13 +42,13 @@
   , iInt      :: Int
   , iMText    :: Maybe T.Text
 } deriving (Show, Eq, Ord)
-mkTableDefs "migrateTest" (tableConfig (''Test, WithRange) [] [])
+mkTableDefs "migrateTest" (tableConfig "" (''Test, WithRange) [] [])
 
 data TestSecond = TestSecond {
     tHashKey :: T.Text
   , tInt :: Int
 } deriving (Show, Eq)
-mkTableDefs "migrateTest2" (tableConfig (''TestSecond, NoRange) [] [])
+mkTableDefs "migrateTest2" (tableConfig "" (''TestSecond, NoRange) [] [])
 
 withDb :: Example (IO b) => String -> AWS b -> SpecWith (Arg (IO b))
 withDb msg code = it msg runcode
diff --git a/test/NestedSpec.hs b/test/NestedSpec.hs
--- a/test/NestedSpec.hs
+++ b/test/NestedSpec.hs
@@ -55,7 +55,7 @@
   , _iList     :: [Inner]
   , _iMap      :: HashMap Name Inner
 } deriving (Show, Eq)
-mkTableDefs "migrateTest" (tableConfig (''Test, WithRange) [] [])
+mkTableDefs "migrateTest" (tableConfig "" (''Test, WithRange) [] [])
 
 withDb :: Example (IO b) => String -> AWS b -> SpecWith (Arg (IO b))
 withDb msg code = it msg runcode
